介绍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 相关文章推荐
一个css与js结合的下拉菜单支持主流浏览器
Oct 08 Javascript
理解javascript模块化
Mar 28 Javascript
详解微信小程序 template添加绑定事件
Jun 23 Javascript
详解vue中computed 和 watch的异同
Jun 30 Javascript
vue.js实现刷新当前页面的方法教程
Jul 05 Javascript
Node.js搭建小程序后台服务
Jan 03 Javascript
p5.js实现斐波那契螺旋的示例代码
Mar 22 Javascript
详解Angular6.0使用路由步骤(共7步)
Jun 29 Javascript
微信小程序实现分享到朋友圈功能
Jul 19 Javascript
jQuery对底部导航进行跳转并高亮显示的实例代码
Apr 23 jQuery
解决ele ui 表格表头太长问题的实现
Nov 13 Javascript
vant picker+popup 自定义三级联动案例
Nov 04 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
一个更简单的无限级分类菜单代码
2007/01/16 PHP
YII Framework教程之异常处理详解
2016/03/14 PHP
PHP定义字符串的四种方式详解
2018/02/06 PHP
ThinkPHP 5 AJAX跨域请求头设置实现过程解析
2020/10/28 PHP
28个JS验证函数收集
2010/03/02 Javascript
javascript 事件查询综合 推荐收藏
2010/03/10 Javascript
dojo学习第一天 Tab选项卡 实现
2011/08/28 Javascript
在js中判断checkboxlist(.net控件客户端id)是否有选中
2013/04/11 Javascript
js格式化货币数据实现代码
2013/09/04 Javascript
extjs render 用法介绍
2013/09/11 Javascript
javascript实现的一个随机点名功能
2014/08/26 Javascript
jquery实现勾选复选框触发事件给input赋值
2015/02/01 Javascript
jquery实现不包含当前项的选择器实例
2015/06/25 Javascript
ichart.js绘制虚线、平均分虚线效果的实现代码
2016/05/05 Javascript
微信小程序 常用工具类详解及实例
2017/02/15 Javascript
nodejs实现邮件发送服务实例分享
2017/03/29 NodeJs
js实现图片局部放大效果详解
2019/03/18 Javascript
详解vue-cli 脚手架 安装
2019/04/16 Javascript
[52:22]EG vs VG Supermajor小组赛B组 BO3 第一场 6.2
2018/06/03 DOTA
[01:13:46]iG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
django中的HTML控件及参数传递方法
2018/03/20 Python
Python中的引用和拷贝实例解析
2019/11/14 Python
利用python实现AR教程
2019/11/20 Python
Python使用QQ邮箱发送邮件报错smtplib.SMTPAuthenticationError
2019/12/20 Python
python-OpenCV 实现将数组转换成灰度图和彩图
2020/01/09 Python
Pycharm2020.1安装无法启动问题即设置中文插件的方法
2020/08/07 Python
纯CSS3实现移动端展开和收起效果的示例代码
2020/04/26 HTML / CSS
详解Html5页面实现下载文件(apk、txt等)的三种方式
2018/10/22 HTML / CSS
戴森台湾线上商城:Dyson Taiwan
2018/05/21 全球购物
ProBikeKit德国:在线公路自行车专家
2018/06/03 全球购物
医生自荐信
2013/10/11 职场文书
法学专业毕业生自荐信
2014/06/11 职场文书
张丽莉观后感
2015/06/16 职场文书
公安忠诚教育心得体会
2016/01/23 职场文书
手写Spirit防抖函数underscore和节流函数lodash
2022/03/22 Javascript
Centos7 Shell编程之正则表达式、文本处理工具详解
2022/08/05 Servers