文章出處

一、前言                              

  當我們使用String-base的模板引擎(如Handlebars.js等)時,要么就通過外部文件存放模板文本,需要時再通過XHR或script標簽加載進來;要么通過<script type="text/x-template"></script>等標簽直接寫在當前頁面上。現在HTML5為我們提供了一個全新的template標簽,以更統一、有效的方式存放String-base模板引擎的模板文本了!

  目錄一坨:

  二、那些年我們存放模板文本的方式

    1. script標簽

        2. textarea標簽

        3. xmp標簽

  三、template標簽的新視覺

     1. 不一樣的childNodes

   2. 偽文檔片段入口——content屬性

 

二、那些年我們存放模板文本的方式                  

  首先要明確模板文檔具有以下2個要求:

    1.  <> "' 不被轉成字符實體;

    2. 含src特性的img標簽不觸發資源請求。

  下面是常用的存放方式:

    1. script標簽

// 模板文本
<script id="tpl" type="text/x-template">
<img src="dummy.png" title="{{title}}"/>
</script>

// 獲取模板
<script type="text/javascript">
// 不能通過innerText獲取,因為innerText無法獲取<img/>等標簽字符
var tpl = document.getElementById('tpl').innerHTML
tpl = tpl.replace(/^[\s\u3000]*|[\s\u3000]*$/, '')
Handlebars.compile(tpl)({title: 'test'})
</script>

   注意:

     1. 若模板中包含</script>標簽會造成標簽結束符混亂的問題,因此通過該方式存放模板時,不能包含</script>結束標簽;

     2. script標簽位置較隨意,可以作為head或body的子元素。

 2. textarea標簽

// 模板文本
<textarea id="tpl" style="display:none;">
<img src="dummy.png" title="{{title}}"/>
</textarea>

// 獲取模板
<script type="text/javascript">
var tplEl = document.getElementById('tpl')
var tpl = tplEl.value
// 通過tplEl.innerText獲取也可以。但不能通過tplEl.innerHTML獲取,因為它會對<>"'等轉換為字符實體
tpl = tpl.replace(/^[\s\u3000]*|[\s\u3000]*$/, '')
Handlebars.compile(tpl)({title: 'test'})
</script>

    注意:

  1. 若模板中包含</textarea>標簽會造成標簽結束符混亂的問題,因此通過該方式存放模板時,不能包含</textarea>結束標簽;

  2. textarea元素必須作為body的子孫元素。

    3. xmp標簽(語義為標識內容用作示例,現已被標準廢除了,但各大瀏覽器依然支持該標簽)

// 模板文本
<xmp id="tpl" style="display:none;">
<img src="dummy.png" title="{{title}}"/>
</xmp>

// 獲取模板
<script type="text/javascript">
var tplEl = document.getElementById('tpl')
var tpl = tplEl.innerHTML
// 通過tplEl.innerText獲取也可以
tpl = tpl.replace(/^[\s\u3000]*|[\s\u3000]*$/, '')
Handlebars.compile(tpl)({title: 'test'})
</script>

    注意:

  1. 若模板中包含</xmp>標簽會造成標簽結束符混亂的問題,因此通過該方式存放模板時,不能包含</xmp>結束標簽;

  2. xmp元素必須作為body的子孫元素。

  由于模板文本中出現<script>標簽的情況較少,而出現表單元素<textarea>標簽的幾率較大,而xmp標簽已被廢棄,因此還是通過script標簽存放模板文本的方式較為常見。

 

三、template標簽的新視覺                      

  2013年定稿的template標簽為我們提供一種更統一、功能更強大的模板文本存放方式。而它基本的使用方式與之前的3種方式無太大差別:

// 模板文本
<template id="tpl">
<img src="dummy.png" title="{{title}}"/>
</template>

// 獲取模板
<script type="text/javascript">
var tplEl = document.getElementById('tpl')
// 通過tplEl.innerText獲取也可以
var tpl = tplEl.innerHTML
tpl = tpl.replace(/^[\s\u3000]*|[\s\u3000]*$/, '')
Handlebars.compile(tpl)({title: 'test'})
</script>

   注意:

     1. 若模板中包含</template>標簽會造成標簽結束符混亂的問題,因此通過該方式存放模板時,不能包含</template>結束標簽;

     2. script標簽位置較隨意,可以作為head或body的子元素。

   到這里大家會覺得template標簽除了作為W3C標準外,跟script標簽沒多大的差別。那是因為我們還沒對其深入而已啦,下面我們將對其一一了解吧!

   1. 不一樣的childNodes

     script、textarea和xmp方式存放模板文本時,通過 tplEl.childNodes.length 均返回1, tplEl.childNodes[0].nodeName 均返回#text。而template返回的是0。

   2. 偽文檔片段入口——content屬性

     通過innerHTML或innerText屬性,template內部的模板文本將被視為普通文本來使用。但template元素為我們提供了另一種使用方式,那就是“文檔片段”。

     “文檔片段”的[[Class]]為[object DocumentFragment],“文檔片段”具有文檔片段的所有功能API,不同的是設置img元素的src屬性不會發出資源請求、不執行Script和CSS規則,而[object HTMLDocument]“文檔”則會發送img請求并在當前browsing context(即window對象上下文)內執行Script和CSS規則。

而我們可以通過content屬性獲取“文檔片段”。

var tplEl = document.getElementById('tpl')
var x = tplEl.content
var img = x.querySelector('img')
console.log(img.src) // 顯示空字符串
console.log(img.getAttribute('src')) // 顯示dummy.png
img.src = img.getAttribute('src')
console.log(img.src) // 顯示about:blank

    當添加到當前文檔中才會發起資源請求。

document.body.appendChild(img)
// 發起資源請求
console.log(tplEl.innerHTML.replace(/^[\s\u3000]*|[\s\u3000]*$/,'')) // 顯示空白字符串

    由于appendChild方法實際上會對元素進行剪切操作,因此無法實現模板復用的效果。因此我們需要復制模板內的元素,然后再將元素副本添加到當前文檔中。實現手段有很多種,大家可以自行了解一下。

    那么怎樣將整個template提供的DocumentFragment導出到當前document呢?答案就是采用IE9+才有的document.importNode方法了。

var tplEl = document.getElementById('tpl')
var x = tplEl.content
var clone = document.importNode(x, true)
document.body.appendChild(x)

 

四、總結                              

  本篇為拜讀張鑫旭《HTML5 <template>標簽元素簡介》后的筆記+個人經驗總結,就寫到這里吧!

  尊重原創,轉載請注明來自:http://www.cnblogs.com/fsjohnhuang/p/4175711.html ^_^肥子John

 

五、參考                              

http://www.zhangxinxu.com/wordpress/2014/07/hello-html5-template-tag/

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/template


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()