项目中需要设计一系列的自定义标签,于是涉及到标签的属性如何访问。使用 HTML5 的 data-* 属性的话,获取元素后直接访问 dataset.属性名称 即可,dataset 的类型为 DOMStringMap {},一个 MAP 对象,仍是 key / value 式的对象,使用上比较方便。但却遇到一个兼容性的问题, 在 Android 2.3 等的一些旧有浏览器上尚不支持。
对此,我们可以写一个兼容性的补丁。主要原理是在“劫持” document.querySelector/querySelectorAll 这类获取元素的方法之后,通过提供自定义的字段 dataset = {....} 即可实现类似标准写法。当然,简单地,你可以通过一个 API 方法来提供类似 getDataAttrib() 获取属性,效果一样。我们之所以不采取这种方式,而采用另外一种方式,是为了更好向标准靠拢,使用大家都一致的访问方式。
我的实现如下:
// 如浏览器不支持 HTML5 data-* 属性,设置一个。 ;(function(){ // 测试元素 var el; el = document.createElement('p'); el.setAttribute('data-id', '111'); if(!el.dataset){ Element.prototype.dataset = {}; var querySelectorAll = document.querySelectorAll; // 保存一个 document.querySelectorAll = function(){ var resultEls = querySelectorAll.apply(this, arguments); for(var resultEl, i = 0, j = resultEls.length; i < j; i++){ resultEl = resultEls[i]; resultEl.dataset = getAttrib(resultEl.attributes) } return resultEls; } // 也就是单个的 document.querySelectorAll()。不保存,直接覆盖 document.querySelector = function(){ var resultEls = document.querySelectorAll.apply(this, arguments); return resultEls ? resultEls[0] : null; }; } el = null; // 要完全移除 dummy 元素,是否这样就 ok? /** * 把元素保存为 JSON 对象 * @param {Element.attributes} 元素属性集合 * @return {Object} */ function getAttrib(attributes) { if (!attributes) return; var hash = {}; for (var attribute, i = 0, j = attributes.length; i < j; i++) { attribute = attributes[i]; if(attribute.nodeName.indexOf('data-') != -1){ hash[attribute.nodeName.slice(5)] = attribute.nodeValue; } } return hash; } })();
考虑到 querySelector 获取元素的方式已经足够,故所以当前没有提供 documeny.getElementByID(“#id”) 方法。
请注意:对于非 document 对象身上执行的 querySelector /querySelectorAll 将不支持,仍不会返回 dataset。 针对该问题,已于2013.1.16 通过重写 Element.prototype 方法解决。详细过程如下:
if(!canSupportDataSet()){ Element.prototype.dataset = {}; modifyQuerySelectorAll_By(document); // document 的好像不一样…… modifyQuerySelectorAll_By(Element.prototype); } /** * 覆盖系统的 querySelector/querySelectorAll 方法。 * @param host {Element.prototype/Document} */ function modifyQuerySelectorAll_By(host){ var querySelectorAll = host.querySelectorAll; // 保存一个 host.querySelectorAll = function(){ var resultEls = querySelectorAll.apply(this, arguments); for(var resultEl, i = 0, j = resultEls.length; i < j; i++){ resultEl = resultEls[i]; resultEl.dataset = getAttrib(resultEl.attributes) } return resultEls; } // 也就是单个的 document.querySelectorAll()。不保存,直接覆盖 host.querySelector = function(){ var resultEls = host.querySelectorAll.apply(this, arguments); return resultEls ? resultEls[0] : null; }; }
测试例子:
<listview id="foo" data-id="1"> Hello World <p data-id="2"></p> </listview> <script> var el = document.querySelector('#foo'); alert(el.querySelector('p').dataset.id); </script>
问题小结:
浏览器必须能够支持 querySelector/querySelectorAll 方法,否则该方法也没有意义;
只能从获取元素的方法提供 dataset。比如事件处理器中参数 e 的 e.tartget. dataset 则是空对象。
如上代码所示,单个的 querySelector() 是经过 querySelectorAll(),当中有遍历数组的操作,能否适当优化一下,使用原生的来做?
对于 CSS Selector Engine 速度敏感的同学,本方法不适用。因为修改系统方法,可见必然性能会下降。但可以保证,这种下降是属于小幅度的;
尚不支持 documeny.getElementByID,待增加之。
以上是如何自动获取HTML5的data-*属性示例代码详解的详细内容。更多信息请关注PHP中文网其他相关文章!

html5的div元素默认一行不可以放两个。div是一个块级元素,一个元素会独占一行,两个div默认无法在同一行显示;但可以通过给div元素添加“display:inline;”样式,将其转为行内元素,就可以实现多个div在同一行显示了。

html5中列表和表格的区别:1、表格主要是用于显示数据的,而列表主要是用于给数据进行布局;2、表格是使用table标签配合tr、td、th等标签进行定义的,列表是利用li标签配合ol、ul等标签进行定义的。

固定方法:1、使用header标签定义文档头部内容,并添加“position:fixed;top:0;”样式让其固定不动;2、使用footer标签定义尾部内容,并添加“position: fixed;bottom: 0;”样式让其固定不动。

html5中不支持的标签有:1、acronym,用于定义首字母缩写,可用abbr替代;2、basefont,可利用css样式替代;3、applet,可用object替代;4、dir,定义目录列表,可用ul替代;5、big,定义大号文本等等。

HTML5中画布标签是“<canvas>”。canvas标签用于图形的绘制,它只是一个矩形的图形容器,绘制图形必须通过脚本(通常是JavaScript)来完成;开发者可利用多种js方法来在canvas中绘制路径、盒、圆、字符以及添加图像等。

html5废弃了dir列表标签。dir标签被用来定义目录列表,一般和li标签配合使用,在dir标签对中通过li标签来设置列表项,语法“<dir><li>列表项值</li>...</dir>”。HTML5已经不支持dir,可使用ul标签取代。

3种取消方法:1、给td元素添加“border:none”无边框样式即可,语法“td{border:none}”。2、给td元素添加“border:0”样式,语法“td{border:0;}”,将td边框的宽度设置为0即可。3、给td元素添加“border:transparent”样式,语法“td{border:transparent;}”,将td边框的颜色设置为透明即可。

因为html5不基于SGML(标准通用置标语言),不需要对DTD进行引用,但是需要doctype来规范浏览器的行为,也即按照正常的方式来运行,因此html5只需要写doctype即可。“!DOCTYPE”是一种标准通用标记语言的文档类型声明,用于告诉浏览器编写页面所用的标记的版本。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),