介绍JavaScript的一个微型模版


Posted in Javascript onJune 24, 2015

 我一直在使用一个小工具,并发现它在构建Javascript应用过程中非常实用。它是一个非常简单的模板函数,速度快,支持缓存,并容易使用。我想分享一下使用它的过程中的一些技巧。

以下是模板函数的代码(你可以从正要出版的Secrets of the JavaScript Ninja一书中得到更精炼的版本):
 

// 简单JavaScript模板引擎
// John Resig - http://ejohn.org/ - MIT Licensed
(function(){
 var cache = {};
 
 this.tmpl = function tmpl(str, data){
  // 判断我们是否已经有这么一个模板,或者我们需要载入模板
  // 并保证把结果保存到缓存中。
  var fn = !/\W/.test(str) ?
   cache[str] = cache[str] ||
    tmpl(document.getElementById(str).innerHTML) :
   
   // 生成一个可重用的函数,用于提供模板生成功能
   // (它会被记录到缓存内).
   new Function("obj",
    "var p=[],print=function(){p.push.apply(p,arguments);};" +
    
    // 通过with(){}把数据作为本地变量引入
    "with(obj){p.push('" +
    
    // 把模板转换未纯javascript代码
    str
     .replace(/[\r\t\n]/g, " ")
     .split("<%").join("\t")
     .replace(/((^|%>)[^\t]*)'/g, "$1\r")
     .replace(/\t=(.*?)%>/g, "',$1,'")
     .split("\t").join("');")
     .split("%>").join("p.push('")
     .split("\r").join("\\'")
   + "');}return p.join('');");
  
  // 给用户提供一些基本的柯里化功能
  return data ? fn( data ) : fn;
 };
})();

你的模板代码看起来将是类似于(这并不是规定的格式,但是我比较喜欢这样):

 

<script type="text/html" id="item_tmpl">
 <div id="<%=id%>" class="<%=(i % 2 == 1 ? " even" : "")%>">
  <div class="grid_1 alpha right">
   <img class="righted" src="<%=profile_image_url%>"/>
  </div>
  <div class="grid_6 omega contents">
   <p><b><a href="/<%=from_user%>"><%=from_user%></a>:</b> <%=text%></p>
  </div>
 </div>
</script>

你也可以内嵌脚本:
 

<script type="text/html" id="user_tmpl">
 <% for ( var i = 0; i < users.length; i++ ) { %>
  <li><a href="<%=users[i].url%>"><%=users[i].name%></a></li>
 <% } %>
</script>

提示:把脚本内嵌到你的页面中,并且content-type是未知的(例如在这个例子中,浏览器不知道该如何执行 text/html 脚本),那么浏览器会把它忽略掉 - 同时搜索引擎和屏幕读取也会忽略掉它。这是一个非常好的伪装代码,可以把你的模板嵌入到你的页面中。我喜欢使用快速却又随性的技术,我只需一到两个小模板,就可以得到又轻型和快速应用。

你可以在脚本中,像这样去使用:
 

var results = document.getElementById("results");
results.innerHTML = tmpl("item_tmpl", dataObject);

你可以预编译结果,在稍后使用。如果你只使用一个ID作为参数(或者一个模板代码)来调用模板函数,那么它就会返回一个预编译的函数,你就可以在稍后调用:
 

var show_user = tmpl("item_tmpl"), html = "";
for ( var i = 0; i < users.length; i++ ) {
 html += show_user( users[i] );
}

这是目前最没办法的办法,解析和转换代码——对这你很可能无爱。不过他只有我中意的一项技术:在字符串中用字符静态搜索和静态替换时,比如split("match").join("replace"),执行速度更好——看起来不直观但可以有效工作在现代浏览器里(下一版FireFox会大幅提高replace(/match/g,"replace")的性能——所以现在这样的长表达式以后不需要的)

放轻松享受它——我很好奇代码中的突变。即使它很简单,仍然有很多事情可以用它做。

Javascript 相关文章推荐
一个高效的JavaScript压缩工具下载集合
Mar 06 Javascript
js data日期初始化的5种方法
Dec 29 Javascript
JS数组的遍历方式for循环与for...in
Jul 31 Javascript
jquery中ready()函数执行的时机和window的load事件比较
Jun 22 Javascript
HTML5之WebSocket入门3 -通信模型socket.io
Aug 21 Javascript
D3.js实现饼状图的方法详解
Sep 21 Javascript
bootstrap模态框消失问题的解决方法
Dec 02 Javascript
js Canvas绘制圆形时钟教程
Feb 06 Javascript
javascript设计模式之中介者模式学习笔记
Feb 15 Javascript
在iframe中使bootstrap的模态框在父页面弹出问题
Aug 07 Javascript
vue项目首屏加载时间优化实战
Apr 23 Javascript
微信小程序基于高德地图查找位置并显示文字
Oct 30 Javascript
js实现a标签超链接提交form表单的方法
Jun 24 #Javascript
对JavaScript客户端应用编程的一些建议
Jun 24 #Javascript
javascript删除数组重复元素的方法汇总
Jun 24 #Javascript
js实现跨域的方法实例详解
Jun 24 #Javascript
JavaScript中的Promise使用详解
Jun 24 #Javascript
JavaScript面对国际化编程时的一些建议
Jun 24 #Javascript
对JavaScript的全文搜索实现相关度评分的功能的方法
Jun 24 #Javascript
You might like
php中的比较运算符详解
2013/10/28 PHP
PHP下通过QRCode类库创建中间带网站LOGO的二维码
2014/07/12 PHP
页面版文本框智能提示JS代码
2009/11/20 Javascript
单击按钮显示隐藏子菜单经典案例
2013/01/04 Javascript
javascript 控制input只允许输入的各种指定内容
2014/06/19 Javascript
Javascript动态创建div的方法
2015/02/09 Javascript
JavaScript实现当网页加载完成后执行指定函数的方法
2015/03/21 Javascript
jQuery的Scrollify插件实现滑动到页面下一节点
2015/07/05 Javascript
基于jQuery实现多标签页切换的效果(web前端开发)
2016/07/24 Javascript
基于MVC+EasyUI的web开发框架之使用云打印控件C-Lodop打印页面或套打报关运单信息
2016/08/29 Javascript
js鼠标按键事件和键盘按键事件用法实例汇总
2016/10/03 Javascript
JS中动态创建元素的三种方法总结(推荐)
2016/10/20 Javascript
JS如何生成一个不重复的ID的函数
2016/12/25 Javascript
js阻止移动端页面滚动的两种方法
2017/01/25 Javascript
Bootstrap Table从零开始
2017/06/30 Javascript
详解ESLint在Vue中的使用小结
2018/10/15 Javascript
vue 授权获取微信openId操作
2020/11/13 Javascript
讲解Python中的标识运算符
2015/05/14 Python
如何准确判断请求是搜索引擎爬虫(蜘蛛)发出的请求
2015/10/13 Python
python3下实现搜狗AI API的代码示例
2018/04/10 Python
强悍的Python读取大文件的解决方案
2019/02/16 Python
python的schedule定时任务模块二次封装方法
2019/02/19 Python
python使用opencv在Windows下调用摄像头实现解析
2019/11/26 Python
Python SSL证书验证问题解决方案
2020/01/13 Python
python自动化测试三部曲之request+django实现接口测试
2020/10/07 Python
Larsson & Jennings官网:现代瑞士钟表匠
2018/03/20 全球购物
手工制作的音乐盒:Music Box Attic
2019/09/05 全球购物
德国购买门票网站:ADticket.de
2019/10/31 全球购物
介绍一下MD5加密算法
2016/11/12 面试题
迎新晚会主持词
2014/03/24 职场文书
结对共建工作方案
2014/06/02 职场文书
党员对照检查材料思想汇报(党的群众路线)
2014/09/24 职场文书
2015年财务人员工作总结
2015/04/10 职场文书
学会感恩主题班会
2015/08/12 职场文书
员工旷工检讨书
2015/08/15 职场文书
CSS实现章节添加自增序号的方法
2021/06/23 HTML / CSS