如何自动获取HTML5的data-*属性示例代码详解


本文摘自PHP中文网,作者黄舟,侵删。

项目中需要设计一系列的自定义标签,于是涉及到标签的属性如何访问。使用 HTML5 的 data-* 属性的话,获取元素后直接访问 dataset.属性名称 即可,dataset 的类型为 DOMStringMap {},一个 MAP 对象,仍是 key / value 式的对象,使用上比较方便。但却遇到一个兼容性的问题, 在 Android 2.3 等的一些旧有浏览器上尚不支持。

对此,我们可以写一个兼容性的补丁。主要原理是在“劫持” document.querySelector/querySelectorAll 这类获取元素的方法之后,通过提供自定义的字段 dataset = {....} 即可实现类似标准写法。当然,简单地,你可以通过一个 API 方法来提供类似 getDataAttrib() 获取属性,效果一样。我们之所以不采取这种方式,而采用另外一种方式,是为了更好向标准靠拢,使用大家都一致的访问方式。

我的实现如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

// 如浏览器不支持 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”) 方法。

阅读剩余部分

相关阅读 >>

jquery实现带弹窗和次数的转盘抽奖(代码)

通过HTML5实现图片上传与预览功能

HTML5语义化标记section和article实例详解

如何使用HTML5 canvas绘制一个矩形

如何使用HTML5 shiv解决ie不兼容HTML5标签的方法

如何让HTML5手机端弹出遮罩菜单特效

如何使用HTML5 canvas绘制文字的轮廓

HTML5 常用标签汇总详情

HTML5中关于封装和添加与获取删除以及cookie介绍

HTML5超链接字体如何改颜色

更多相关阅读请进入《HTML5》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...