介绍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 相关文章推荐
ajax 文件上传应用简单实现
Mar 03 Javascript
JQuery 遮罩层实现(mask)实现代码
Jan 09 Javascript
基于Jquery的将DropDownlist的选中值赋给label的实现代码
May 06 Javascript
jQuery实现可用于博客的动态滑动菜单完整实例
Sep 17 Javascript
JS动态日期时间的获取方法
Sep 28 Javascript
JavaScript数组去重算法实例小结
May 07 Javascript
详解Vue取消eslint语法限制
Aug 04 Javascript
ES6 系列之 Generator 的自动执行的方法示例
Oct 19 Javascript
微信小程序自定义可滑动日历界面
Dec 28 Javascript
解决 viewer.js 动态更新图片导致无法预览的问题
May 14 Javascript
微信小程序实现多图上传
Jun 19 Javascript
JavaScript声明变量和数据类型的转换
Apr 12 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中call_user_func_array()函数的用法演示
2012/02/05 PHP
PHP中SESSION使用中的一点经验总结
2012/03/30 PHP
PHP输出XML到页面的3种方法详解
2013/06/06 PHP
Yii中CGridView禁止列排序的设置方法
2016/07/12 PHP
PHP单例模式与工厂模式详解
2017/08/29 PHP
PHP多个图片压缩成ZIP的方法
2020/08/18 PHP
php实现银联商务公众号+服务窗支付的示例代码
2019/10/12 PHP
用javascript父窗口控制只弹出一个子窗口
2007/04/10 Javascript
编写跨浏览器的javascript代码必备[js多浏览器兼容写法]
2008/10/29 Javascript
javascript中的parseInt和parseFloat区别
2013/07/12 Javascript
JavaScript:Div层拖动效果实例代码
2013/08/06 Javascript
原生javascript 学习之js变量全面了解
2016/07/14 Javascript
KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法
2016/10/05 Javascript
使用 jQuery.ajax 上传带文件的表单遇到的问题
2016/10/31 Javascript
Node.js pipe实现源码解析
2017/08/12 Javascript
浅析Vue.js中v-bind v-model的使用和区别
2018/12/04 Javascript
详解如何使用微信小程序云函数发送短信验证码
2019/03/13 Javascript
es6中比较有用的7个技巧小结
2019/07/12 Javascript
js微信分享接口调用详解
2019/07/23 Javascript
[05:06]TI4西雅图DOTA2前线报道 海涛密探LGD训练
2014/07/09 DOTA
[01:09:13]DOTA2-DPC中国联赛 正赛 CDEC vs XG BO3 第三场 1月19日
2021/03/11 DOTA
python中的代码编码格式转换问题
2015/06/10 Python
Python中turtle作图示例
2017/11/15 Python
深入分析python中整型不会溢出问题
2018/06/18 Python
Pandas 重塑(stack)和轴向旋转(pivot)的实现
2019/07/22 Python
python用match()函数爬数据方法详解
2019/07/23 Python
Python进度条的制作代码实例
2019/08/31 Python
18个Python脚本可加速你的编码速度(提示和技巧)
2019/10/17 Python
Python实现剪刀石头布小游戏(与电脑对战)
2019/12/31 Python
python获取时间戳的实现示例(10位和13位)
2020/09/23 Python
阿波罗盒子:Apollo Box
2017/08/14 全球购物
SHEIN台湾:购买最新流行女装服饰
2019/05/18 全球购物
打架检讨书50字
2014/01/11 职场文书
网络信息安全承诺书
2014/03/26 职场文书
优秀大学生自荐信
2015/03/26 职场文书
机关单位2016年法制宣传日活动总结
2016/04/01 职场文书