• IE6/7中setAttribute不支持class/for/rowspan/colspan等属性


    如设置class属性

    1
    el.setAttribute('class', 'abc');

    在IE6/7中样式“abc”将没有起作用,虽然使用el.getAttribute('class')能取到值“abc”。

    又如for属性

    1
    2
    3
    4
    5
    <label>姓名:</label><input type="checkbox" id="name"/>
    <script>
        var lab = document.getElementsByTagName('label')[0];
        lab.setAttribute('for', 'name');
    </script>

    我们知道当lab设置了for属性,点击label将自动将对应的checkbox选中。但以上设置在IE6/7点击将不会选中checkbox。

    类似的情况还发生在 cellspacing/cellpadding 上。汇总如下:

    1. class
    2. for
    3. cellspacing
    4. cellpadding
    5. tabindex
    6. readonly
    7. maxlength
    8. rowspan
    9. colspan
    10. usemap
    11. frameborder
    12. contenteditable

    因此,当写一个通用的跨浏览器的设置元素属性的接口方法时需要考虑注意以上属性在IE6/7中的特殊性。如下

    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
    dom = (function() {
        var fixAttr = {
            tabindex: 'tabIndex',
            readonly: 'readOnly',
            'for': 'htmlFor',
            'class': 'className',
            maxlength: 'maxLength',
            cellspacing: 'cellSpacing',
            cellpadding: 'cellPadding',
            rowspan: 'rowSpan',
            colspan: 'colSpan',
            usemap: 'useMap',
            frameborder: 'frameBorder',
            contenteditable: 'contentEditable'
        },
         
        div = document.createElement( 'div' );
         
        div.setAttribute('class', 't');
         
        var supportSetAttr = div.className === 't';
         
        return {
            setAttr : function(el, name, val) {
                el.setAttribute(supportSetAttr ? name : (fixAttr[name] || name), val);
            },
            getAttr : function(el, name) {
                return el.getAttribute(supportSetAttr ? name : (fixAttr[name] || name));
            }
        }
    })();

      

    首先,标准浏览器直接使用原始属性名;其次,IE6/7非以上列举的属性仍然用原始属性名;最后这些特殊属性(与JS关键字同名如for,class)使用fixAttr。

    好了,现在不用考虑className/htmlFor了,都使用class/for即可。

    1
    2
    3
    4
    dom.setAttr(el, 'class', 'red');
    dom.getAttr(el, 'class');
    dom.setAttr(el, 'for', 'userName');
    dom.getAttr(el, 'for');
  • 相关阅读:
    P4178 Tree
    CF437D The Child and Zoo
    CF1032G Chattering ST表+倍增
    P4165 [SCOI2007]组队 推柿子+差分
    P1450 [HAOI2008]硬币购物 容斥原理+完全背包
    P6275 [USACO20OPEN]Sprinklers 2: Return of the Alfalfa P 轮廓线DP
    P6009 [USACO20JAN]Non-Decreasing Subsequences P 矩阵优化DP
    P2605 [ZJOI2010]基站选址 线段树优化DP
    P5597 【XR-4】复读 思维题 +二叉树合并
    P5304 [GXOI/GZOI2019]旅行者 最短路+位运算优化
  • 原文地址:https://www.cnblogs.com/rainbow661314/p/3291934.html
Copyright © 2020-2023  润新知