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学习笔记 获取jQuery对象
Sep 19 Javascript
Javascript操作cookie的函数代码
Oct 03 Javascript
用js实现控件的隐藏及style.visibility的使用
Jun 14 Javascript
js转化毫秒为时间格式代码
Apr 10 Javascript
JavaScript中的函数重载深入理解
Aug 04 Javascript
JavaScript实现瀑布流布局
Jun 28 Javascript
Function.prototype.apply()与Function.prototype.call()小结
Apr 27 Javascript
使用jquery实现的循环连续可停顿滚动实例
Nov 23 Javascript
手机注册发送验证码倒计时的简单实例
Nov 15 Javascript
webpack配置导致字体图标无法显示的解决方法
Mar 06 Javascript
jQuery实现ajax的嵌套请求案例分析
Feb 16 jQuery
Vue3.x源码调试的实现方法
Oct 13 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 需要掌握的东西 不做浮躁的人
2009/12/28 PHP
PHP全概率运算函数(优化版) Webgame开发必备
2011/07/04 PHP
纯PHP生成的一个树叶图片画图例子
2014/04/16 PHP
CentOS 6.3下安装PHP xcache扩展模块笔记
2014/09/10 PHP
PHP中is_dir()函数使用指南
2015/05/08 PHP
php项目开发中用到的快速排序算法分析
2016/06/25 PHP
如何正确配置Nginx + PHP
2016/07/15 PHP
PHP PDOStatement::fetch讲解
2019/01/31 PHP
Jquery网页出现的乱码问题的三种解决方法
2013/06/30 Javascript
javascript中实现兼容JAVA的hashCode算法代码分享
2020/08/11 Javascript
js实现兼容性好的微软官网导航下拉菜单效果
2015/09/07 Javascript
BootStrap的JS插件之轮播效果案例详解
2016/05/16 Javascript
vuex实现简易计数器
2016/10/27 Javascript
详细AngularJs4的图片剪裁组件的实例
2017/07/12 Javascript
vuex的module模块用法示例
2018/11/12 Javascript
jQuery实现获取当前鼠标位置并输出功能示例
2019/01/05 jQuery
java遇到微信小程序 &quot;支付验证签名失败&quot; 问题解决
2019/12/22 Javascript
vue 百度地图(vue-baidu-map)绘制方向箭头折线实例代码详解
2020/04/28 Javascript
[31:00]2014 DOTA2华西杯精英邀请赛5 24 NewBee VS iG
2014/05/25 DOTA
Python在Windows和在Linux下调用动态链接库的教程
2015/08/18 Python
python如何在列表、字典中筛选数据
2018/03/19 Python
Python使用numpy产生正态分布随机数的向量或矩阵操作示例
2018/08/22 Python
英国最大的专业户外零售商:Mountain Warehouse
2018/06/06 全球购物
Kusmi茶美国官网:优质散叶茶和茶包
2019/10/13 全球购物
请说出几个常用的异常类
2013/01/08 面试题
劳资员岗位职责
2013/11/11 职场文书
小学校园活动策划
2014/01/30 职场文书
小班重阳节活动方案
2014/02/08 职场文书
学习十八大报告感言
2014/02/28 职场文书
给校长的一封建议书
2014/03/12 职场文书
机电一体化应届生求职信
2014/08/09 职场文书
2014年重阳节老干部座谈会局领导发言稿
2014/09/25 职场文书
2015年公路路政个人工作总结
2015/07/24 职场文书
办公室卫生管理制度
2015/08/04 职场文书
Go标准容器之Ring的使用说明
2021/05/05 Golang
Pytorch中expand()的使用(扩展某个维度)
2022/07/15 Python