ejs v9 javascript模板系统


Posted in Javascript onMarch 21, 2012

本版本就是改回v6的形态,后端数据还是带@前端才方便查看与调试。昨天也与一TX前端工程师讨论过这个必要性。取得模板中的需要填写的变量,再与后端传过来的JSON进行比较,尽早进行数据验证。这种技术,可以看一看PHP的变量命名就知了,带是带$前缀。
在之前的版本中,如果输出语句带分号或逗号是会报错的

<script type="tmpl" id="table_tmpl"> 
<table> 
<& for(var i=0,tl = @trs.length,tr;i<tl;i++){ &> 
<& tr = @trs[i]; &> 
<tr> 
<td><&= tr.name; &></td> <td><&= tr.age; &></td> <td><&= tr.sex || "男" &></td> 
</tr> 
<& } &> 
</table> 
<&# 怎么可能不支持图片 &> 
<img src="<&= @href &>"> 
</script>

因为内部生成的字符串是这个样子的:
__views(data.tr.name;)
为了防止用户顺手把个逗号或分号上去,本版本自动帮你处理了.
rlastSemi = /[,;]\s*$/ 
// 略 
case "="://处理后台返回的变量(输出到页面的); 
logic = els[0].substring(1); 
if(logic.indexOf("@")!==-1){ 
temp.push( startOfHTML, logic.replace(rAt,"$1data.").replace(rlastSemi,''), endOfHTML ); 
}else{ 
temp.push( startOfHTML, logic.replace(rlastSemi,''), endOfHTML ); 
} 
break;

例子
下面是一个模板,放置于浏览器会忽略解析JS代码的script标签之内, 注意trs与href前面都带有@标识符。
<script type="tmpl" id="table_tmpl"> 
<table> 
<& for(var i=0,tl = @trs.length,tr;i<tl;i++){ &> 
<& tr = @trs[i]; &> 
<tr> 
<td><&= tr.name &></td> <td><&= tr.age &></td> <td><&= tr.sex || "男" &></td> 
<&# 导入子模板 &> 
<&= $.ejs("tds_tmpl"); &> 
</tr> 
<& } &> 
</table> 
<&# 怎么可能不支持图片 &> 
<img src="<&= @href &>"> 
</script> 
<!-- 这是子模板 --> 
<script type="tmpl" id="tds_tmpl"> 
<td>静态的表格</d> <td>静态的表格</d> <td>静态的表格</d> 
</script>

这是它的JS代码:
$.require("ready,more/ejs,node", function(){ 
var trs = [ 
{name:"隐形杀手",age:29,sex:"男"}, 
{name:"索拉",age:22,sex:"男"}, 
{name:"fesyo",age:23,sex:"女"}, 
{name:"恋妖壶",age:18,sex:"男"}, 
{name:"?崎",age:25,sex:"男"}, 
{name:"你不懂的",age:30,sex:"女"} 
] 
var html = $.ejs("table_tmpl",{ 
trs: trs, 
href: "https://3water.com//rubylouvre/202906/o_type4.jpg" 
}); 
$("#table_tc").html(html) 
});

ejs v9 javascript模板系统

ejs源代码

$.define("ejs", "lang",function(){ 
var 
_startOfHTML = "\t__views.push(", 
_endOfHTML = ");\n", 
sRight = "&>", 
rLeft = /\s*<&\s*/, 
rRight = /\s*&>\s*/, 
rAt = /(^|[^\w\u00c0-\uFFFF_])(@)(?=\w)/g, 
rLastSemi = /[,;]\s*$/ 
var ejs2 = $.ejs = function(id,data){ 
data = data || {}; 
if( !ejs2[id] ){ 
var rleft = rLeft, 
rright = rRight, 
sright = sRight, 
rlastSemi = rLastSemi, 
startOfHTML = _startOfHTML, 
endOfHTML = _endOfHTML, str , logic, 
el = document.getElementById(id); 
if (!el) throw "can not find the target element"; 
str = el.innerHTML; 
var arr = str.trim().split(rleft), 
buff = ["var __views = [];\n"],temp = [],i = 0,n = arr.length,els,segment; 
while(i < n){//逐行分析,以防歧义 
segment = arr[i++]; 
els = segment.split(rright); 
if( ~segment.indexOf(sright) ){//这里不使用els.length === 2是为了避开IE的split bug 
switch ( els[0].charAt(0) ) { 
case "="://处理后台返回的变量(输出到页面的); 
logic = els[0].substring(1); 
if(logic.indexOf("@")!==-1){ 
temp.push( startOfHTML, logic.replace(rAt,"$1data.").replace(rlastSemi,''), endOfHTML ); 
}else{ 
temp.push( startOfHTML, logic.replace(rlastSemi,''), endOfHTML ); 
} 
break; 
case "#"://处理注释 
break; 
default://处理逻辑 
logic = els[0]; 
if(logic.indexOf("@")!==-1){ 
temp.push( logic.replace(rAt,"$1data."), "\n" ); 
}else{ 
temp.push( logic, "\n" ); 
} 
} 
//处理静态HTML片断 
els[1] && temp.push(startOfHTML, $.quote( els[1] ), endOfHTML) 
}else{ 
//处理静态HTML片断 
temp.push(startOfHTML, $.quote( els[0] ), endOfHTML ); 
} 
} 
ejs2[id] = new Function("data",buff.concat(temp).join("")+';return __views.join("");'); 
return ejs2[id]( data ) 
} 
return ejs2[id]( data ) 
} 
}) 
// ejs v9!
Javascript 相关文章推荐
JQuery下的Live方法和$.browser方法使用代码
Jun 02 Javascript
基于jquery的划词搜索实现(备忘)
Sep 14 Javascript
Web 前端设计模式--Dom重构 提高显示性能
Oct 22 Javascript
css+js实现部分区域高亮可编辑遮罩层
Mar 04 Javascript
JavaScript常用标签和方法总结
Sep 01 Javascript
轻松学习jQuery插件EasyUI EasyUI实现拖动基本操作
Nov 30 Javascript
JS中artdialog弹出框控件之提交表单思路详解
Apr 18 Javascript
郁闷!ionic中获取ng-model绑定的值为undefined如何解决
Aug 27 Javascript
JavaScript设计模式之享元模式实例详解
Jan 17 Javascript
浅谈vue项目,访问路径#号的问题
Aug 14 Javascript
Ant Design的可编辑Tree的实现操作
Oct 31 Javascript
Vue实现Header渐隐渐现效果的实例代码
Nov 05 Javascript
js判断一个元素是否为另一个元素的子元素的代码
Mar 21 #Javascript
HTML中的setCapture和releaseCapture使用介绍
Mar 21 #Javascript
JS无法捕获滚动条上的mouse up事件的原因猜想
Mar 21 #Javascript
js对象关系图 方便dom操作
Mar 18 #Javascript
再谈javascript面向对象编程
Mar 18 #Javascript
一个简单的Ext.XTemplate的实例代码
Mar 18 #Javascript
Javascript 面向对象编程(coolshell)
Mar 18 #Javascript
You might like
PHP生成excel时单元格内换行问题的解决方法
2010/08/26 PHP
PHP逐行输出(ob_flush与flush的组合)
2012/02/04 PHP
用来解析.htpasswd文件的PHP类
2012/09/05 PHP
解析wamp5下虚拟机配置文档
2013/06/27 PHP
smarty中post用法实例
2014/11/28 PHP
PHP排序算法之基数排序(Radix Sort)实例详解
2018/04/21 PHP
thinkphp5.0整合phpsocketio完整攻略(绕坑)
2018/10/12 PHP
几个比较实用的JavaScript 测试及效验工具
2010/04/18 Javascript
javascript实现TreeView 无刷新展开的实例代码
2013/07/13 Javascript
javascript中直接写php代码的方法
2013/07/31 Javascript
javascript操作excel生成报表示例
2014/05/08 Javascript
js实现文章文字大小字号功能完整实例
2014/11/01 Javascript
深入剖析JavaScript编程中的对象概念
2015/10/21 Javascript
JS重载实现方法分析
2016/12/16 Javascript
微信小程序 template模板详解及实例
2017/02/21 Javascript
详解JavaScript对象的深浅复制
2017/03/30 Javascript
JS实现线性表的链式表示方法示例【经典数据结构】
2017/04/11 Javascript
xmlplus组件设计系列之按钮(2)
2017/04/26 Javascript
详解vue-cli官方脚手架配置
2018/07/20 Javascript
微信小程序实现弹出层效果
2020/05/26 Javascript
javascript之分片上传,断点续传的实际项目实现详解
2019/09/05 Javascript
Js利用正则表达式去除字符串的中括号
2020/11/23 Javascript
Python爬虫基础之XPath语法与lxml库的用法详解
2018/09/13 Python
Python Django框架实现应用添加logging日志操作示例
2019/05/17 Python
Python 等分切分数据及规则命名的实例代码
2019/08/16 Python
实现Python与STM32通信方式
2019/12/18 Python
TensorFlow Saver:保存和读取模型参数.ckpt实例
2020/02/10 Python
简单了解pytest测试框架setup和tearDown
2020/04/14 Python
浅析Python 序列化与反序列化
2020/08/05 Python
Python爬取豆瓣数据实现过程解析
2020/10/27 Python
澳大利亚最受欢迎的超级商场每日优惠:Catch
2020/11/17 全球购物
市场部规章制度
2014/01/24 职场文书
电台编导求职信
2014/05/06 职场文书
党员个人剖析材料
2014/09/30 职场文书
Python 实现绘制子图及子图刻度的变换等问题
2021/05/31 Python
SQL Server内存机制浅探
2022/04/06 SQL Server