介绍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数组操作总结和属性、方法介绍
Apr 05 Javascript
jQuery中eq()方法用法实例
Jan 05 Javascript
浅谈js中的引用和复制(传值和传址)
Sep 18 Javascript
JavaScript &amp; jQuery完美判断图片是否加载完毕
Jan 08 Javascript
jquery实现页面加载效果
Feb 21 Javascript
利用node.js实现反向代理的方法详解
Jul 24 Javascript
js数字滑动时钟的简单实现(示例讲解)
Aug 14 Javascript
动态创建Angular组件实现popup弹窗功能
Sep 15 Javascript
JS使用贪心算法解决找零问题示例
Nov 27 Javascript
微信小程序实现折叠与展开文章功能
Jun 12 Javascript
vue拖拽组件使用方法详解
Dec 01 Javascript
vue-week-picker实现支持按周切换的日历
Jun 26 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
评分9.0以上的动画电影,剧情除了经典还很燃
2020/03/04 日漫
用PHP实现登陆验证码(类似条行码状)
2006/10/09 PHP
PHP 关于访问控制的和运算符优先级介绍
2013/07/08 PHP
php单一接口的实现方法
2015/06/20 PHP
php解决和避免form表单重复提交的几种方法
2016/08/31 PHP
PhpStorm 2020.3:新增开箱即用的PHP 8属性(推荐)
2020/10/30 PHP
jquery 图片截取工具jquery.imagecropper.js
2010/04/09 Javascript
浅谈javascript的原型继承
2012/07/25 Javascript
JS实现拖动示例代码
2013/11/01 Javascript
Egret引擎开发指南之发布项目
2014/09/03 Javascript
Node.js实现批量去除BOM文件头
2014/12/20 Javascript
javascript学习总结之js使用技巧
2015/09/02 Javascript
Bootstrap Navbar Component实现响应式导航
2016/10/08 Javascript
AngularJS Select(选择框)使用详解
2017/01/18 Javascript
基于React实现表单数据的添加和删除详解
2017/03/14 Javascript
javascript 日期相减-在线教程(附代码)
2017/08/17 Javascript
浅谈Angular4实现热加载开发旅程
2017/09/08 Javascript
使用React手写一个对话框或模态框的方法示例
2019/04/25 Javascript
详解Webpack4多页应用打包方案
2020/07/16 Javascript
python进阶教程之文本文件的读取和写入
2014/08/29 Python
Python迭代器和生成器介绍
2015/03/06 Python
Django imgareaselect手动剪切头像实现方法
2015/05/26 Python
Tensorflow 利用tf.contrib.learn建立输入函数的方法
2018/02/08 Python
对Python 内建函数和保留字详解
2018/10/15 Python
如何利用Boost.Python实现Python C/C++混合编程详解
2018/11/08 Python
一款基于css3和jquery实现的动画显示弹出层按钮教程
2015/01/04 HTML / CSS
html5指南-2.如何操作document metadata
2013/01/07 HTML / CSS
美国美妆网站:B-Glowing
2016/10/12 全球购物
成人大专生实习期的自我评价
2013/10/02 职场文书
社区优秀志愿者材料
2014/02/02 职场文书
小学少先队活动方案
2014/02/18 职场文书
药剂专业自荐信范文
2014/04/16 职场文书
企业党建工作汇报材料
2014/08/19 职场文书
学生未请假就回家检讨书
2014/09/22 职场文书
安全生产月宣传标语
2014/10/06 职场文书
2016年党支部公开承诺书
2016/03/25 职场文书