介紹JavaScript的一個微型模版
我一直在使用一個小工具,并發(fā)現(xiàn)它在構(gòu)建Javascript應(yīng)用過程中非常實用。它是一個非常簡單的模板函數(shù),速度快,支持緩存,并容易使用。我想分享一下使用它的過程中的一些技巧。
以下是模板函數(shù)的代碼(你可以從正要出版的Secrets of the JavaScript Ninja一書中得到更精煉的版本):
// 簡單JavaScript模板引擎 // John Resig - http://ejohn.org/ - MIT Licensed (function(){ var cache = {}; this.tmpl = function tmpl(str, data){ // 判斷我們是否已經(jīng)有這么一個模板,或者我們需要載入模板 // 并保證把結(jié)果保存到緩存中。 var fn = !/\W/.test(str) ? cache[str] = cache[str] || tmpl(document.getElementById(str).innerHTML) : // 生成一個可重用的函數(shù),用于提供模板生成功能 // (它會被記錄到緩存內(nèi)). new Function("obj", "var p=[],print=function(){p.push.apply(p,arguments);};" + // 通過with(){}把數(shù)據(jù)作為本地變量引入 "with(obj){p.push('" + // 把模板轉(zhuǎn)換未純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; }; })();
你的模板代碼看起來將是類似于(這并不是規(guī)定的格式,但是我比較喜歡這樣):
<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>
你也可以內(nèi)嵌腳本:
<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>
提示:把腳本內(nèi)嵌到你的頁面中,并且content-type是未知的(例如在這個例子中,瀏覽器不知道該如何執(zhí)行 text/html 腳本),那么瀏覽器會把它忽略掉 - 同時搜索引擎和屏幕讀取也會忽略掉它。這是一個非常好的偽裝代碼,可以把你的模板嵌入到你的頁面中。我喜歡使用快速卻又隨性的技術(shù),我只需一到兩個小模板,就可以得到又輕型和快速應(yīng)用。
你可以在腳本中,像這樣去使用:
var results = document.getElementById("results"); results.innerHTML = tmpl("item_tmpl", dataObject);
你可以預編譯結(jié)果,在稍后使用。如果你只使用一個ID作為參數(shù)(或者一個模板代碼)來調(diào)用模板函數(shù),那么它就會返回一個預編譯的函數(shù),你就可以在稍后調(diào)用:
var show_user = tmpl("item_tmpl"), html = ""; for ( var i = 0; i < users.length; i++ ) { html += show_user( users[i] ); }
這是目前最沒辦法的辦法,解析和轉(zhuǎn)換代碼——對這你很可能無愛。不過他只有我中意的一項技術(shù):在字符串中用字符靜態(tài)搜索和靜態(tài)替換時,比如split("match").join("replace"),執(zhí)行速度更好——看起來不直觀但可以有效工作在現(xiàn)代瀏覽器里(下一版FireFox會大幅提高replace(/match/g,"replace")的性能——所以現(xiàn)在這樣的長表達式以后不需要的)
放輕松享受它——我很好奇代碼中的突變。即使它很簡單,仍然有很多事情可以用它做。
相關(guān)文章
JavaScript的Set數(shù)據(jù)結(jié)構(gòu)詳解
這篇文章主要為大家介紹了JavaScript的Set數(shù)據(jù)結(jié)構(gòu),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-01-01JavaScript 中的執(zhí)行上下文和執(zhí)行棧實例講解
這篇文章主要介紹了JavaScript 中的執(zhí)行上下文和執(zhí)行棧實例講解,文中實例講解的很清晰,有感興趣的同學可以研究下2021-02-02setTimeout和setInterval的瀏覽器兼容性分析
setTimeout和setInterval的瀏覽器兼容性分析...2007-02-02javascript創(chuàng)建對象、對象繼承的實用方式詳解
JavaScript中的對象是基于原型的。原型是對象的基礎(chǔ),它定義并實現(xiàn)了一個新對象所必須包含的成員列表,并被所有同類對象實例所共享。與其他語言中類的概念相比,原型更像是類的靜態(tài)成員。本文著重給大家介紹javascript創(chuàng)建對象、對象繼承的實用方式2016-03-03四種參數(shù)傳遞的形式——URL,超鏈接,js,form表單
本文介紹了四種參數(shù)傳遞的形式,并給出了URL,超鏈接,js,form表單傳參方式,需要的朋友可以參考下2015-07-07在JS中操作時間之getUTCMilliseconds()方法的使用
這篇文章主要介紹了在JavaScript中操作時間之getUTCMilliseconds()方法的使用,是JavaScript入門學習中的基礎(chǔ)知識,需要的朋友可以參考下2015-06-06