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 相关文章推荐
javascript跑马灯悬停放大效果实现代码
Dec 12 Javascript
javascript数组去重小结
Mar 07 Javascript
14 个折磨人的 JavaScript 面试题
Aug 08 Javascript
AngularJS指令用法详解
Nov 02 Javascript
使用JS批量选中功能实现更改数据库中的status状态值(批量展示)
Nov 22 Javascript
微信小程序后台解密用户数据实例详解
Jun 28 Javascript
微信小程序tabBar底部导航中文注解api详解
Aug 16 Javascript
浅谈vue-router 路由传参的方法
Dec 27 Javascript
vue中阻止click事件冒泡,防止触发另一个事件的方法
Feb 08 Javascript
Node.js连接Sql Server 2008及数据层封装详解
Aug 27 Javascript
JS函数节流和防抖之间的区分和实现详解
Jan 11 Javascript
使用Angular Cli如何创建Angular私有库详解
Jan 30 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识别二维码的方法(php-zbarcode安装与使用)
2016/07/07 PHP
php 字符串中是否包含指定字符串的多种方法
2018/04/12 PHP
javascript 简单高效判断数据类型 系列函数 By shawl.qiu
2007/03/06 Javascript
jquery实现div拖拽宽度示例代码
2013/07/31 Javascript
jquery 追加tr和删除tr示例代码
2013/09/12 Javascript
javascript(js)的小数点乘法除法问题详解
2014/03/07 Javascript
JS时间特效最常用的三款
2015/08/19 Javascript
简单理解vue中Props属性
2016/10/27 Javascript
基于jQuery实现Accordion手风琴自定义插件
2020/10/13 Javascript
Bootstrap DateTime Picker日历控件简单应用
2017/03/25 Javascript
ES6教程之for循环和Map,Set用法分析
2017/04/10 Javascript
ES6新特性八:async函数用法实例详解
2017/04/21 Javascript
jQuery实现简单的滑动导航代码(移动端)
2017/05/22 jQuery
vue中Npm run build 根据环境传递参数方法来打包不同域名
2018/03/29 Javascript
微信小程序开发之tabbar图标和颜色的实现
2018/10/17 Javascript
[05:49]DOTA2-DPC中国联赛 正赛 Elephant vs LBZS 选手采访
2021/03/11 DOTA
python实现带声音的摩斯码翻译实现方法
2015/05/20 Python
在Python中通过getattr获取对象引用的方法
2019/01/21 Python
对python中if语句的真假判断实例详解
2019/02/18 Python
一篇文章弄懂Python中的可迭代对象、迭代器和生成器
2019/08/12 Python
python监控nginx端口和进程状态
2019/09/06 Python
python使用html2text库实现从HTML转markdown的方法详解
2020/02/21 Python
django-xadmin根据当前登录用户动态设置表单字段默认值方式
2020/03/13 Python
PyCharm 2020 激活到 2100 年的教程
2020/03/25 Python
pandas处理csv文件的方法步骤
2020/10/16 Python
如何在scrapy中集成selenium爬取网页的方法
2020/11/18 Python
css3中仿放大镜效果的几种方式原理解析
2020/12/03 HTML / CSS
继承公证书样本
2014/04/04 职场文书
《吃水不忘挖井人》教学反思
2014/04/15 职场文书
我爱我家教学反思
2014/05/01 职场文书
大学奖学金获奖感言
2014/08/15 职场文书
营运督导岗位职责
2015/04/10 职场文书
回复函范文
2015/07/14 职场文书
《倍数和因数》教学反思
2016/02/23 职场文书
redis requires ruby version2.2.2的解决方案
2021/07/15 Redis
python双向链表实例详解
2022/05/25 Python