介绍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各种复制代码收集
Sep 20 Javascript
window.location和document.location的区别分析
Dec 23 Javascript
用JS判断IE版本的代码 超管用!
Aug 09 Javascript
JavaScript自学笔记(必看篇)
Jun 23 Javascript
浅谈json取值(对象和数组)
Jun 24 Javascript
jquery 属性选择器(匹配具有指定属性的元素)
Sep 06 Javascript
移动端使用localStorage缓存Js和css文的方法(web开发)
Sep 20 Javascript
利用JS轻松实现获取表单数据
Dec 06 Javascript
BootStrap 下拉菜单点击之后不会出现下拉菜单(下拉菜单不弹出)的解决方案
Dec 14 Javascript
vue 项目地址去掉 #的方法
Oct 20 Javascript
javascript中的闭包概念与用法实践分析
Jul 26 Javascript
多页vue应用的单页面打包方法(内含打包模式的应用)
Jun 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 修复未正常关闭的HTML标签实现代码(支持嵌套和就近闭合)
2012/06/07 PHP
PHP在线打包下载功能示例
2016/10/15 PHP
php中实现字符串翻转的方法
2017/02/22 PHP
jQuery获取标签文本内容和html内容的方法
2015/03/27 Javascript
JavaScript判断对象是否为数组
2015/12/22 Javascript
JavaScript实现复制文章自动添加版权
2016/08/02 Javascript
浅谈在js传递参数中含加号(+)的处理方式
2016/10/11 Javascript
JavaScript之WebSocket技术详解
2016/11/18 Javascript
基于JavaScript实现熔岩灯效果导航菜单
2017/01/04 Javascript
js 数据存储和DOM编程
2017/02/09 Javascript
vue移动端裁剪图片结合插件Cropper的使用实例代码
2017/07/10 Javascript
详解Angular-cli生成组件修改css成less或sass的实例
2017/07/27 Javascript
JS实现前端缓存的方法
2017/09/21 Javascript
vue项目使用axios发送请求让ajax请求头部携带cookie的方法
2018/09/26 Javascript
vue单页面在微信下只能分享落地页的解决方案
2019/04/15 Javascript
深入源码解析Python中的对象与类型
2015/12/11 Python
Python使用文件锁实现进程间同步功能【基于fcntl模块】
2017/10/16 Python
在PyCharm导航区中打开多个Project的关闭方法
2019/01/17 Python
详解python 模拟豆瓣登录(豆瓣6.0)
2019/04/18 Python
python接口自动化测试之接口数据依赖的实现方法
2019/04/26 Python
python 监控logcat关键字功能
2020/09/04 Python
python入门教程之基本算术运算符
2020/11/13 Python
Html5 postMessage实现跨域消息传递
2016/03/11 HTML / CSS
websocket+sockjs+stompjs详解及实例代码
2018/11/30 HTML / CSS
美国最大的农村生活方式零售店:Tractor Supply Company(TSC)
2017/05/15 全球购物
ECCO爱步官方旗舰店:丹麦鞋履品牌
2018/01/02 全球购物
COS美国官网:知名服装品牌
2019/04/08 全球购物
英国领先的体验日提供商:Buyagift
2019/04/19 全球购物
Currentbody德国站:健康与美容技术专家
2020/04/05 全球购物
大学生职业生涯规划书参考模板
2014/03/05 职场文书
局机关干部群众路线个人对照检查材料思想汇报
2014/10/05 职场文书
元宵节寄语大全
2015/02/27 职场文书
关于车尾的标语大全
2015/08/11 职场文书
Python上下文管理器Content Manager
2021/06/26 Python
Mongodb 迁移数据块的流程介绍分析
2022/04/18 MongoDB
Spring Data JPA框架的核心概念和Repository接口
2022/04/28 Java/Android