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中 关于json空对象筛选替换
Apr 15 Javascript
js二维数组定义和初始化的三种方法总结
Mar 03 Javascript
把jQuery的类、插件封装成seajs的模块的方法
Mar 12 Javascript
js四舍五入数学函数round使用实例
May 09 Javascript
jQuery级联操作绑定事件实例
Sep 02 Javascript
JS实现仿新浪黄色经典滑动门效果代码
Sep 27 Javascript
微信小程序 引用其他js文件实现代码
Feb 22 Javascript
基于vue1和vue2获取dom元素的方法
Mar 17 Javascript
详解ES7 Decorator 入门解析
Feb 18 Javascript
layui导出所有数据的例子
Sep 10 Javascript
js的Object.assign用法示例分析
Mar 05 Javascript
JS如何操作DOM基于表格动态展示数据
Oct 15 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 magic_quotes_gpc的一点认识与分析
2008/08/18 PHP
PHP 基本语法格式
2009/12/15 PHP
wordpress自定义url参数实现路由功能的代码示例
2013/11/28 PHP
php中使用Ajax时出现Error(c00ce56e)的详细解决方案
2014/11/03 PHP
php实现简单的守护进程创建、开启与关闭操作
2019/08/13 PHP
根据分辨率不同,调用不同的css文件
2006/07/07 Javascript
ExtJS TabPanel beforeremove beforeclose使用说明
2010/03/31 Javascript
JS 自定义函数缺省值的设置方法
2010/05/05 Javascript
纯JS实现动态时间显示代码
2014/02/08 Javascript
基于 Docker 开发 NodeJS 应用
2014/07/30 NodeJs
javascript内置对象操作详解
2015/02/04 Javascript
解决jQuery uploadify在非IE核心浏览器下无法上传
2015/08/05 Javascript
详解javascript中的事件处理
2015/11/06 Javascript
js编写一个简单的产品放大效果代码
2016/06/27 Javascript
React Native时间转换格式工具类分享
2017/10/24 Javascript
记一次webpack3升级webpack4的踩坑经历
2018/06/12 Javascript
Auto.js自动收取自己和好友蚂蚁森林能量脚本
2018/06/28 Javascript
Bootstrap FileInput实现图片上传功能
2021/01/28 Javascript
跟老齐学Python之正规地说一句话
2014/09/28 Python
python3+requests接口自动化session操作方法
2018/10/13 Python
python实现朴素贝叶斯算法
2018/11/19 Python
Django的ListView超详细用法(含分页paginate)
2020/05/21 Python
Python应用实现双指数函数及拟合代码实例
2020/06/19 Python
css 如何让背景图片拉伸填充避免重复显示
2013/07/11 HTML / CSS
June Jacobs尊积帕官网:知名的spa水疗护肤品牌
2019/03/21 全球购物
英国户外服装、鞋类和设备的领先零售商:Millets
2020/10/12 全球购物
保洁主管岗位职责
2013/11/20 职场文书
会计系毕业生求职信
2014/05/28 职场文书
公司离职证明标准格式
2014/11/18 职场文书
工厂清洁工岗位职责
2015/02/14 职场文书
个人总结怎么写
2015/02/26 职场文书
全国爱眼日活动总结
2015/02/27 职场文书
2019年圣诞节祝福语集锦
2019/12/25 职场文书
Go语言-为什么返回值为接口类型,却返回结构体
2021/04/24 Golang
redis 限制内存使用大小的实现
2021/05/08 Redis
springboot用户数据修改的详细实现
2022/04/06 Java/Android