HTML语义化:HTML5新标签——template

一、前言                              

当我们使用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属性不会发出资源请求。而我们可以通过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方法实际上会对元素进行剪切操作,因此无法实现模板复用的效果。因此我们需要复制模板内的元素,然后再将元素副本添加到当前文档中。实现手段有很多种,大家可以自行了解一下。

四、总结                              

本篇为拜读张鑫旭《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

时间: 2024-12-08 13:18:15

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

HTML5中新增的语义化标签,及在IE5.5~9(IE9已经开始支持部分HTML5新标签了)支持这些新标签的兼容性处理。

一.前言 本文将介绍HTML5中新增的语义化标签,及在IE5.5~9(IE9已经开始支持部分HTML5新标签了)支持这些新标签的兼容性处理. 目录一坨: 二.语义化标签:article.aside.time.mark.section.header.footer.hgroup.progress.figure.figcaption.nav.meter.output.details.summary.ruby和main   三.让IE5.5~9支持HTML5新标签 1. IE5.5~8下对于不支持的标签

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

新特性: 1. 拖拽释放(Drag and drop) API 2. 语义化更好的内容标签(header,nav,footer,aside,article,section) 3. 音频.视频API(audio,video) 4. 画布(Canvas) API 5. 地理(Geolocation) API 6. 本地离线存储 localStorage 长期存储数据,浏览器关闭后数据不丢失: 7. sessionStorage 的数据在浏览器关闭后自动删除 8. 表单控件,calendar.date

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

HTML5现在已经不是SGML的子集,主要是关于图像,位置,存储,多任务等功能的增加. 绘画canvas: 用于媒介回放的video和audio元素: 本地离线存储localStorage长期存储数据,浏览器关闭后数据不丢失: sessionStorage的数据在浏览器关闭后自动删除: 语义化更好的元素,比如article,footer,header,nav,section: 表单控件:calender,date,time,email,url,search 新的技术:webworker,webs

html5新标签及废弃元素

html5新标签 <canvas> 新元素 标签 描述 <canvas> 标签定义图形,比如图表和其他图像.该标签基于 JavaScript 的绘图 API 新多媒体元素 标签 描述 <audio> 定义音频内容 <video> 定义视频(video 或者 movie) <source> 定义多媒体资源 <video> 和 <audio> <embed> 定义嵌入的内容,比如插件. <track>

H5C3day1:更具语义化的H5标签

1.1 H5特性 HTML5在语法规范上也做了比较大的调整,去除了许多冗余的内容,书写规则更加简洁.清晰. 特点: 1.更简洁 2.更宽松 单标签不用写关闭符号 双标签省略结束标签 html.head.body.colgroup.tbody可以完全省略 实际开发中应规范书写,不建议太随意 ! 语义标签对于我们并不陌生,如<p>表示一个段落.<ul>表示一个无序列表<h1> ~ <h6>表示一系列标题等,在此基础上HTML5增加了大量更有意义的语义标签,更有利

如何处理HTML5新标签的兼容性问题

支持HTML5新标签: * IE8/IE7/IE6支持通过document.createElement方法产生的标签, 可以利用这一特性让这些浏览器支持HTML5新标签, 浏览器支持新标签后,还需要添加标签默认的样式: * 当然最好的方式是直接使用成熟的框架.使用最多的是html5shim框架 <!--[if lt IE 9]> <script> src="http://html5shim.googlecode.com/svn/trunk/html5.js"&l

HTML5新标签解释及其使用场景

我们来看一下HTML 5提供的一些新的标签用法和HTML 4的区别 <article> 标签定义外部的内容.比如来自一个外部的新闻提供者的一篇新的文章,或者来自 blog 的文本,或者是来自论坛的文本,亦或是来自其他外部源内容.HTML5:<article></article>HTML4:<div></div> <aside> 标签定义 article 以外的内容:aside 的内容应该与 article 的内容相关.HTML5:&l

HTML标签语义化——使用b标签,还是strong标签

HTML标签语义化,相关的内容网上有很多.大家可以去学习一下,看一下你所使用的标签是否具有其真正要表达的意义,标签你用对了吗?今天要介绍的内容是使用b标签,还是strong标签,翻译自http://www.think-ink.net/html/bold.htm. There is a difference between using what are referred to as logical tags and tags that primarily affect visual layout.

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

没估计错的话旧版浏览器都是不识别这些新增的标签所以都是用行内元素来处理解决的,所以,有一个解决办法的突破口就是让它变成块状元素就不会处于同一行了,这样在新旧浏览器都是可以显示同样的效果,再者就是让浏览器识别标签,需要新增标签,具体解决办法是: IE8/IE7/IE6支持通过document.createElement方法产生的标签,可以利用这一特性让这些浏览器支持HTML5新标签,代码如下: document.createElement('新标签'); / /新增创建新标签   方式一:Codi