介绍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 相关文章推荐
自动更新作用
Oct 08 Javascript
JavaScript OOP面向对象介绍
Dec 02 Javascript
JQuery操作单选按钮以及复选按钮示例
Sep 23 Javascript
关于js中for in的缺陷浅析
Dec 02 Javascript
js的正则test,match,exec详细解析
Jan 29 Javascript
JavaScript实现DIV层拖动及动态增加新层的方法
May 12 Javascript
vue.js学习之vue-cli定制脚手架详解
Jul 02 Javascript
解决vue同一slot在组件中渲染多次的问题
Sep 06 Javascript
小程序绑定用户方案优化小结
May 15 Javascript
vue elementUI table 自定义表头和行合并的实例代码
May 22 Javascript
Vue的双向数据绑定实现原理解析
Feb 17 Javascript
JQuery通过键盘控制键盘按下与松开触发事件
Aug 07 jQuery
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中将汉字转换成拼音的函数代码
2012/09/08 PHP
windows下的WAMP环境搭建图文教程(推荐)
2017/07/27 PHP
PHP智能识别收货地址信息实例
2019/01/05 PHP
Laravel validate error处理,ajax,json示例
2019/10/25 PHP
火狐浏览器(firefox)下获得Event对象以及keyCode
2008/11/13 Javascript
Javascript表达式中连续的 &amp;&amp; 和 || 之赋值区别
2010/10/17 Javascript
火狐textarea输入法的bug的触发及解决
2013/07/24 Javascript
javascript实现多栏闭合展开式广告位菜单效果实例
2015/08/05 Javascript
JS+CSS实现鼠标经过弹出一个DIV框完整实例(带缓冲动画渐变效果)
2016/03/25 Javascript
Javascript打印局部页面实例
2016/06/21 Javascript
浅谈js停止事件冒泡 阻止浏览器的默认行为(阻止超连接 #)
2017/02/08 Javascript
Linux系统中利用node.js提取Word(doc/docx)及PDF文本的内容
2017/06/17 Javascript
vue-cli webpack 引入jquery的方法
2018/01/10 jQuery
vue.js项目 el-input 组件 监听回车键实现搜索功能示例
2018/08/25 Javascript
vue中typescript装饰器的使用方法超实用教程
2019/06/17 Javascript
一起写一个即插即用的Vue Loading插件实现
2019/10/31 Javascript
零基础写python爬虫之使用Scrapy框架编写爬虫
2014/11/07 Python
Django中的CBV和FBV示例介绍
2018/02/25 Python
对python创建及引用动态变量名的示例讲解
2018/11/10 Python
python实现顺时针打印矩阵
2019/03/02 Python
numpy.random模块用法总结
2019/05/27 Python
详解Numpy数组转置的三种方法T、transpose、swapaxes
2019/05/27 Python
pyqt5 QScrollArea设置在自定义侧(任何位置)
2019/09/25 Python
python机器学习实现决策树
2019/11/11 Python
Pycharm 2020年最新激活码(亲测有效)
2020/09/18 Python
详解Selenium 元素定位和WebDriver常用方法
2020/12/04 Python
美国牛仔品牌:True Religion
2018/11/16 全球购物
英国礼品和生活方式品牌:Treat Republic
2020/11/21 全球购物
财务管理专业毕业生求职信范文
2013/09/21 职场文书
毕业生求职的求职信
2013/12/05 职场文书
11月红领巾广播稿
2014/01/17 职场文书
个人廉政承诺书
2015/04/28 职场文书
归途列车观后感
2015/06/17 职场文书
小学语文教师竞聘演讲稿范文
2019/08/09 职场文书
在K8s上部署Redis集群的方法步骤
2021/04/27 Redis
Pytest中skip skipif跳过用例详解
2021/06/30 Python