介绍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 相关文章推荐
JQuery1.8 判断元素是否绑定事件的方法
Jul 10 Javascript
使用jQuery的easydrag插件实现可拖动的DIV弹出框
Feb 19 Javascript
Bootstrapvalidator校验、校验清除重置的实现代码(推荐)
Sep 28 Javascript
js获取指定字符前/后的字符串简单实例
Oct 27 Javascript
bootstrap table 表格中增加下拉菜单末行出现滚动条的快速解决方法
Jan 05 Javascript
JS实现禁止用户使用Ctrl+鼠标滚轮缩放网页的方法
Apr 28 Javascript
详解使用React全家桶搭建一个后台管理系统
Nov 04 Javascript
vuex的使用及持久化state的方式详解
Jan 23 Javascript
vue使用iframe嵌入网页的示例代码
Jun 09 Javascript
Vue开发环境中修改端口号的实现方法
Aug 15 Javascript
Vue实现简易计算器
Feb 25 Javascript
浅析我对JS延迟异步脚本的思考
Oct 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程序61条面向对象分析设计的经验小结
2008/11/12 PHP
php实现微信企业号支付个人的方法详解
2017/07/26 PHP
PHP图像处理 imagestring添加图片水印与文字水印操作示例
2020/02/06 PHP
js怎么覆盖原有方法实现重写
2014/09/04 Javascript
jQuery对象与DOM对象转换方法详解
2016/05/10 Javascript
javascript自执行函数
2017/02/10 Javascript
JavaScript控制输入框中只能输入中文、数字和英文的方法【基于正则实现】
2017/03/03 Javascript
JS动态添加的div点击跳转到另一页面实现代码
2017/09/30 Javascript
微信小程序实现跟随菜单效果和循环嵌套加载数据
2017/11/21 Javascript
Vue.js添加组件操作示例
2018/06/13 Javascript
vue 修改 data 数据问题并实时显示的方法
2018/08/27 Javascript
vue2.0 如何在hash模式下实现微信分享
2019/01/22 Javascript
Vue实现验证码功能
2019/12/03 Javascript
node.js中fs文件系统模块的使用方法实例详解
2020/02/13 Javascript
[47:43]完美世界DOTA2联赛PWL S3 Magama vs GXR 第二场 12.19
2020/12/24 DOTA
Python运行的17个时新手常见错误小结
2012/08/07 Python
使用python提取html文件中的特定数据的实现代码
2013/03/24 Python
Django自定义过滤器定义与用法示例
2018/03/22 Python
Python文件打开方式实例详解【a、a+、r+、w+区别】
2019/03/30 Python
Python 函数list&amp;read&amp;seek详解
2019/08/28 Python
Python使用matplotlib 画矩形的三种方式分析
2019/10/31 Python
pyspark给dataframe增加新的一列的实现示例
2020/04/24 Python
css3 利用transform打造走动的2D时钟
2020/10/20 HTML / CSS
雅诗兰黛旗下走天然植物路线的彩妆品牌:Prescriptives
2016/08/14 全球购物
萨克斯第五大道的折扣店:Saks Fifth Avenue OFF 5TH
2016/08/25 全球购物
Spartoo葡萄牙鞋类网站:线上销售鞋履与时尚配饰
2017/01/11 全球购物
我们是伦敦女孩:WalG
2018/01/08 全球购物
美国牙科折扣计划:DentalPlans.com
2019/08/26 全球购物
const char*, char const*, char*const的区别是什么
2014/07/09 面试题
机械专业个人求职自荐信格式
2013/09/21 职场文书
大一学生假期实习的自我评价
2013/10/12 职场文书
大学军训感言
2014/01/10 职场文书
安全大检查反思材料
2014/01/31 职场文书
刑事辩护词范文
2015/05/21 职场文书
建党伟业观后感
2015/06/01 职场文书
Python中requests做接口测试的方法
2021/05/30 Python