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 onmouseout 解决办法
Jul 17 Javascript
JS俄罗斯方块,包含完整的设计理念
Dec 11 Javascript
浅析js中取绝对值的2种方法
Jul 09 Javascript
可选择和输入的下拉列表框示例
Nov 05 Javascript
jQuery取id有.的值的方法
May 21 Javascript
多个checkbox被选中时如何判断是否有自己想要的
Sep 22 Javascript
Jquery ajax 同步阻塞引起的UI线程阻塞问题
Nov 17 Javascript
使用veloticy-ui生成文字动画效果
Feb 08 Javascript
vue2.0项目实现路由跳转的方法详解
Jun 21 Javascript
vue this.reload 方法 配置
Sep 12 Javascript
JQuery基于FormData异步提交数据文件
Sep 01 jQuery
JS实现简单贪吃蛇小游戏
Oct 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
PHP在字符断点处截断文字的实现代码
2011/04/21 PHP
php实现的zip文件内容比较类
2014/09/24 PHP
JavaScript写的一个DIV 弹出网页对话框
2009/08/14 Javascript
网页自动跳转代码收集
2009/09/27 Javascript
JQuery的Ajax跨域请求原理概述及实例
2013/04/26 Javascript
javascript中定义私有方法说明(private method)
2014/01/27 Javascript
使用CSS样式position:fixed水平滚动的方法
2014/02/19 Javascript
javascript深拷贝的原理与实现方法分析
2017/04/10 Javascript
详解VUE 数组更新
2017/12/16 Javascript
php 解压zip压缩包内容到指定目录的实例
2018/01/23 Javascript
node.js微信小程序配置消息推送的实现
2019/02/13 Javascript
详解微信小程序scroll-view横向滚动的实践踩坑及隐藏其滚动条的实现
2019/03/14 Javascript
JS为什么说async/await是generator的语法糖详解
2019/07/11 Javascript
js实现简单页面全屏
2019/09/17 Javascript
Vue + Node.js + MongoDB图片上传组件实现图片预览和删除功能详解
2020/04/29 Javascript
vue组件讲解(is属性的用法)模板标签替换操作
2020/09/04 Javascript
Python写的Tkinter程序屏幕居中方法
2015/03/10 Python
在Python下尝试多线程编程
2015/04/28 Python
python计算牛顿迭代多项式实例分析
2015/05/07 Python
Python的MongoDB模块PyMongo操作方法集锦
2016/01/05 Python
python实现红包裂变算法
2016/02/16 Python
Python2.7下安装Scrapy框架步骤教程
2017/12/22 Python
Python中字典的浅拷贝与深拷贝用法实例分析
2018/01/02 Python
python散点图实例之随机漫步
2018/08/27 Python
在Python中输入一个以空格为间隔的数组方法
2018/11/13 Python
Python实现字典按key或者value进行排序操作示例【sorted】
2019/05/03 Python
Python实现socket非阻塞通讯功能示例
2019/11/06 Python
Sentry错误日志监控使用方法解析
2020/11/12 Python
自1926年以来就为冰岛保持温暖:66°North
2020/11/27 全球购物
法雷奥SQA(electric)面试问题
2016/01/23 面试题
电子商务专业毕业生工作推荐信
2013/11/17 职场文书
教育专业自荐书范文
2013/12/17 职场文书
基层党支部承诺书
2015/04/30 职场文书
无保留意见审计报告
2015/06/05 职场文书
《当代神农氏》教学反思
2016/02/23 职场文书
Mysql存储过程、触发器、事件调度器使用入门指南
2022/01/22 MySQL