介紹JavaScript的一個微型模版_基礎知識

來源:互聯網
上載者:User

 我一直在使用一個小工具,並發現它在構建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")的效能——所以現在這樣的長運算式以後不需要的)

放輕鬆享受它——我很好奇代碼中的突變。即使它很簡單,仍然有很多事情可以用它做。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.