介绍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 相关文章推荐
5个javascript的数字格式化函数分享
Dec 07 Javascript
关于锚点跳转及jQuery下相关操作与插件
Oct 01 Javascript
JavaScript中Null与Undefined的区别解析
Jun 30 Javascript
jQuery动态星级评分效果实现方法
Aug 06 Javascript
jQuery+AJAX实现遮罩层登录验证界面(附源码)
Sep 13 Javascript
JS简单获取及显示当前时间的方法
Aug 03 Javascript
KnockoutJS 3.X API 第四章之表单value绑定
Oct 10 Javascript
Bootstrap 表单验证formValidation 实现表单动态验证功能
May 17 Javascript
VUE预渲染及遇到的坑
Sep 03 Javascript
vue 点击按钮增加一行的方法
Sep 07 Javascript
小试小程序云开发(小结)
Jun 06 Javascript
layer.alert回调函数执行关闭弹窗的实例
Sep 11 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与python实现的线程池多线程爬虫功能示例
2016/10/12 PHP
用PHP的socket实现客户端到服务端的通信实例详解
2017/02/04 PHP
PHP进程通信基础之信号
2017/02/19 PHP
thinkPHP5 ACL用户权限模块用法详解
2017/05/10 PHP
yii2中LinkPager增加总页数和总记录数的实例
2017/08/28 PHP
PHP判断json格式是否正确的实现代码
2017/09/20 PHP
Laravel 自定命令以及生成文件的例子
2019/10/23 PHP
基于prototype的validation.js发布2.3.4新版本,让你彻底脱离表单验证的烦恼
2006/12/06 Javascript
js控制表单不能输入空格的小例子
2013/11/20 Javascript
通过url查找a元素并点击
2014/04/09 Javascript
jquery实现的仿天猫侧导航tab切换效果
2015/08/24 Javascript
jQuery中判断对象是否存在的方法汇总
2016/02/24 Javascript
javascript html5移动端轻松实现文件上传
2020/03/27 Javascript
简单实现jQuery进度条轮播实例代码
2016/06/20 Javascript
javascript代码调试之console.log 用法图文详解
2016/09/30 Javascript
bootstrapValidator.min.js表单验证插件
2017/02/09 Javascript
js canvas实现放大镜查看图片功能
2017/06/08 Javascript
Angularjs之ngModel中的值验证绑定方法
2018/09/13 Javascript
vue动态添加路由addRoutes之不能将动态路由存入缓存的解决
2019/02/19 Javascript
jQuery实现电梯导航模块
2020/12/22 jQuery
Python网络编程详解
2017/10/31 Python
Django原生sql也能使用Paginator分页的示例代码
2017/11/15 Python
对python 多线程中的守护线程与join的用法详解
2019/02/18 Python
Python语言检测模块langid和langdetect的使用实例
2019/02/19 Python
基于Python的Post请求数据爬取的方法详解
2019/06/14 Python
canvas 实现 github404动态效果的示例代码
2017/11/15 HTML / CSS
施华洛世奇加拿大官网:SWAROVSKI加拿大
2018/06/03 全球购物
科茨沃尔德家居商店:Scotts of Stow
2018/06/29 全球购物
俄罗斯美容和健康网上商店:Созвездие Красоты
2019/07/23 全球购物
节能环保标语
2014/06/12 职场文书
代领毕业证委托书
2014/08/02 职场文书
门卫岗位职责说明书
2014/08/18 职场文书
党的群众路线对照检查材料
2014/08/27 职场文书
2014小学语文教师个人工作总结
2014/12/03 职场文书
聚会通知怎么写
2015/04/23 职场文书
煤矿安全生产工作总结
2015/08/13 职场文书