一、前言                              

当我们使用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[].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

HTML语义化:HTML5新标签——template的更多相关文章

  1. html5有哪些新特性、移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分 HTML 和 HTML5?

    * HTML5 现在已经不是 SGML(标准通用标记语言,是一种定义电子文档结构和描述其内容的国际标准语言) 的子集,主要是关于图像,位置,存储,多任务等功能的增加.   * 拖拽释放(Drag an ...

  2. 让IE6,7,8支持HTML5新标签的方法

    很多网站对网页进行重构的时候,提高标签的语义性,在网页中大量使用了section,article,header等HTML5新标签.考虑到目前win7自带的IE浏览器版本是IE8,而IE8不支持HTML ...

  3. HTML5有哪些新特性,移除了哪些元素?如何处理HTML5新标签的浏览器兼容性问题?如何区分HTML和HTML5?

    HTML5现在已经不是SGML的子集,主要是关于图像,位置,存储,多任务等功能的增加. 绘画canvas: 用于媒介回放的video和audio元素: 本地离线存储localStorage长期存储数据 ...

  4. HTML5新标签与特性---新表单+新属性----综合案例1

    HTML5新标签与特性 兼容性问题 (ie9 以上的版本) 文档类型设定 document HTML: sublime 输入 html:4s XHTML: sublime 输入 html:xt HTM ...

  5. html5\CSS3有哪些新特性、移除了哪些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分HTML和HTML5?

    (1)HTML5现在已经不是SGML的子集,主要是关于图像,位置,存储,地理定位等功能的增加. 绘画canvas元素: 用于媒介回放的video和audio元素: 本地离线存储localStorage ...

  6. HTML5新标签 w3c

    w3c标准下的HTML5新标签 ,做个归纳总结: H5标签 定义和用法 兼容性 <artical> 规定独立的自包含内容, 支持html中的全局属性, 支持html中的事件属性 IE: 支 ...

  7. 让ie浏览器支持html5新标签的解决方法(使用html5shiv)

    没估计错的话旧版浏览器都是不识别这些新增的标签所以都是用行内元素来处理解决的,所以,有一个解决办法的突破口就是让它变成块状元素就不会处于同一行了,这样在新旧浏览器都是可以显示同样的效果,再者就是让浏览 ...

  8. Html5新标签解释及用法

    Html5新标签解释及用法 HTML 5 是一个新的网络标准,目标在于取代现有的 HTML 4.01, XHTML 1.0 and DOM Level 2 HTML 标准.它希望能够减少浏览器对于需要 ...

  9. Html5新标签及用法

    HTML 5 是一个新的网络标准,目标在于取代现有的 HTML 4.01, XHTML 1.0 and DOM Level 2  HTML 标准.它希望能够减少浏览器对于需要插件的丰富性网络应用服务( ...

随机推荐

  1. c# 动态执行脚本,相关的几个脚本引擎.

    Jint   嵌入式的javascript脚本支持引擎,一直都在更新,对各种方法支持也比较好,可以 C# 交互. https://github.com/sebastienros/jint Jurass ...

  2. google map javascript api v3 例子

    之前一直用百度map,但如果是国外的项目就需要用google地图.由于在国内屏蔽了google地图的服务,因此调用的是一个国内地址(开发用).这个地址没有用key,语言设置也还是中文的. //---- ...

  3. 你写的return null正确吗?

    上次一篇“你写的try…catch真的有必要吗”引起了很多朋友的讨论.本次我在code review又发现了一个问题,那就是有人有意无意的写出了return null这样的代码,例如: public ...

  4. 人人都是 DBA(XV)锁信息收集脚本汇编

    什么?有个 SQL 执行了 8 秒! 哪里出了问题?臣妾不知道啊,得找 DBA 啊. DBA 人呢?离职了!!擦!!! 程序员在无处寻求帮助时,就得想办法自救,努力让自己变成 "伪 DBA& ...

  5. Flex contextMenu

    没想到再这里也要跌跌撞撞. 这个东西我很久之前就懂了的啊! 最开始是这么写的: private function init():void { var contextMenu:ContextMenu = ...

  6. Java基础之网络编程

    网络编程:1.网络编程概述 (1)网络模型 OSI参考模型 TCP/IP参考模型 (2)网络通讯要素 IP地址 端口号 传输协议 (3)网络通讯前提: **找到对方IP **数据要发送到指定端口.为了 ...

  7. EF架构~为分组添加位运算聚合方法

    回到目录 我们知道在Linq里的分组groupby可以对集合中一个或者多个字段进行分组,并对其中一个属性进行聚合,而Linq为我们提供了多种聚合方法,由aver,sum,count等,而在大叔权限体系 ...

  8. Java构造函数

    构造函数的定义: 构造函数 ,是一种特殊的方法.主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中.特别的一个类可以有多个构造函数 ,可根据其参数个 ...

  9. [Linux]Linux下安装和配置solr/tomcat/IK分词器 详细实例二.

    为了更好的排版, 所以将IK分词器的安装重启了一篇博文,  大家可以接上solr的安装一同查看.[Linux]Linux下安装和配置solr/tomcat/IK分词器 详细实例一: http://ww ...

  10. Atitit 马尔可夫过程(Markov process) hmm隐马尔科夫。 马尔可夫链,的原理attilax总结

    Atitit 马尔可夫过程(Markov process) hmm隐马尔科夫. 马尔可夫链,的原理attilax总结 1. 马尔可夫过程1 1.1. 马尔科夫的应用 生成一篇"看起来像文章的 ...