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 相关文章推荐
跨浏览器的设置innerHTML方法
Sep 18 Javascript
javascript replace()正则替换实现代码
Feb 26 Javascript
JQuery小知识
Oct 15 Javascript
面向对象的Javascript之一(初识Javascript)
Jan 20 Javascript
JS实现匀速运动的代码实例
Nov 29 Javascript
js全选实现和判断是否有复选框选中的方法
Feb 17 Javascript
JavaScript中的substr()方法使用详解
Jun 06 Javascript
javascript实现显示和隐藏div方法汇总
Aug 14 Javascript
详解JavaScript中|单竖杠运算符的使用方法
May 23 Javascript
React.Js添加与删除onScroll事件的方法详解
Nov 03 Javascript
vue移动端弹框组件的实例
Sep 25 Javascript
webpack+vue-cli项目中引入外部非模块格式js的方法
Sep 28 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
ThinkPHP 防止表单重复提交的方法
2011/08/08 PHP
php上传图片之时间戳命名(保存路径)
2014/08/15 PHP
PHP使用socket发送HTTP请求的方法
2016/02/14 PHP
Laravel中服务提供者和门面模式的入门介绍
2017/11/06 PHP
仿校内登陆框,精美,给那些很厉害但是没有设计天才的程序员
2008/11/24 Javascript
jQuery Ajax使用 全解析
2010/12/15 Javascript
js URL参数的拼接方法比较
2012/02/15 Javascript
JavaScript面向对象知识串结(读JavaScript高级程序设计(第三版))
2012/07/17 Javascript
js 剪切板应用clipboardData详细解析
2013/12/17 Javascript
jquery左边浮动到一定位置时显示返回顶部按钮
2014/06/05 Javascript
使用javaScript动态加载Js文件和Css文件
2015/10/24 Javascript
AngularJs Injecting Services Into Controllers详解
2016/09/02 Javascript
浅析Ajax语法
2016/12/05 Javascript
微信JSAPI支付操作需要注意的细节
2017/01/10 Javascript
js实现截图保存图片功能的代码示例
2017/02/16 Javascript
Router解决跨模块下的页面跳转示例
2018/01/11 Javascript
Vue $emit $refs子父组件间方法的调用实例
2018/09/12 Javascript
vue脚手架项目创建步骤详解
2021/03/02 Vue.js
[44:39]2014 DOTA2国际邀请赛中国区预选赛 NE VS CNB
2014/05/21 DOTA
简单讲解Python编程中namedtuple类的用法
2016/06/21 Python
python使用正则表达式的search()函数实现指定位置搜索功能
2017/11/10 Python
matplotlib savefig 保存图片大小的实例
2018/05/24 Python
python  logging日志打印过程解析
2019/10/22 Python
用Python绘制漫步图实例讲解
2020/02/26 Python
windows、linux下打包Python3程序详细方法
2020/03/17 Python
基于python实现音乐播放器代码实例
2020/07/01 Python
data:image data url 文件转为Blob上传后端的方法
2019/07/16 HTML / CSS
娇韵诗Clarins意大利官方网站:法国天然护肤品牌
2020/03/11 全球购物
天网面试题
2013/04/07 面试题
css animation配合SVG制作能量流动效果
2021/03/24 HTML / CSS
综合实践活动方案
2014/02/14 职场文书
《郑和远航》教学反思
2014/04/16 职场文书
企业授权委托书范本
2014/09/22 职场文书
爱晚亭导游词
2015/02/09 职场文书
品德与社会教学反思
2016/02/24 职场文书
Python中re模块的元字符使用小结
2022/04/07 Python