javascript cloneNode无法复制事件

  在标准浏览器(firefox,chrome,非IE核心的)下,cloneNode(true)是不复制事件的,以防止循环引用无法释放内存,而IE却没有考虑到这一点,把事件复制了(inconformity),并且IE只能复制通过attachEvent添加的事件,直接通过domNode.onclick添加的事件也无法复制。

  测试代码如下

<script>
    window.onload = function () {
        function addEvent(o, name, func) {
            if (o.addEventListener) o.addEventListener(name, func, false);
            else o.attachEvent('on' + name, func);
        }
        var div = document.createElement('div');
        div.innerHTML = '通过onclick属性添加事件,在IE和标准浏览器下都无法复制对象事件';
        div.selfDefinedAttr = '自定义属性'
        div.onclick = function () { alert('onclick添加的事件') }
        document.body.appendChild(div);

        div = div.cloneNode(true);
        div.innerHTML = '通过cloneNode(true),无法复制onclick属性(事件)';
        document.body.appendChild(div);
        alert(div.selfDefinedAttr)//非ie浏览器输出undefined,不能复制domNode.后的自定属性

        document.body.appendChild(document.createElement('br'));
        document.body.appendChild(document.createElement('br'));
        document.body.appendChild(document.createElement('br'));

        div = document.createElement('div');
        div.innerHTML = '通过addEventListener/attachEvent方法增加事件,标准浏览器无法复制对象事件,IE可以复制事件';
        div.setAttribute('selfDefinedAttr', '自定义属性');//自定义属性需要这样设置,在ie和标准浏览器下都支持
        addEvent(div, 'click', function () { alert('addEventListener/attachEvent方法增加事件') });
        document.body.appendChild(div);

        div = div.cloneNode(true);
        div.innerHTML = '通过cloneNode(true),标准浏览器无法复制对象事件,IE可以复制事件';
        document.body.appendChild(div);
        alert(div.getAttribute('selfDefinedAttr'))

    }
</script>
名称 详明
insertTbody 标准浏览器只有在table与tr之间不存在tbody的情况下添加tbody,而IE678则笨多了,即在里面为空也乱加tbody
checkOn 在大多数游览器中checkbox的value默认为on,唯有chrome返回空字符串
optSelected 当为select元素添加一个新option元素时,此option会被选中,但IE与早期的safari却没有这样做,需要访问一下其父元素后才能让它处于选中状态(bug)
optDisabled 判定disabled的select元素内部的option元素是否也有diabled属性,没有才是标准
attrHref IE67无法区分href属性与特性(bug)
attrStyle IE67是没有style特性(特性的值的类型为文本),只有el.style(CSSStyleDeclaration)(bug)
attrProp 对于一些特殊的特性,如class, for, char,IE67需要通过映射方式才能使用getAttribute才能取到值(bug)
cssOpacity 是否能正确返回opacity的样式值
traverseAll IE678的getElementByTagName("*")无法遍历出Object元素下的param元素(bug)
createAll IE678不能通过innerHTML生成link,style,script节点(bug)
cloneHTML5 IE6789由于无法识别HTML5的新标签,因此复制这些新元素时也不正确(bug)
cloneNode 在标准浏览器下,cloneNode(true)是不复制事件的,以防止循环引用无法释放内存,而IE却没有考虑到这一点,把事件复制了(inconformity)
cloneChecked IE6789的checkbox、radio控件在cloneNode(true)后,新元素没有继承原来的checked属性(bug)
fastFragment fastFragment 是否支持createContextualFragment API,此方法发端于FF3,因此许多浏览器不支持或实现存在BUG,但它是将字符串转换为文档碎片的最高效手段
inlineBlock 在IE678中,非替换元素在设置了大小与hasLayout的情况下,会将其父级元素撑大(inconformity)
cssPercentedMargin getComputedStyle API是否能支持将margin的百分比原始值自动转换为像素值
boxModel 是否遵循w3c的盒子boxModel去计算元素的大小(IE存在怪异模式,inconformity)

来源:http://www.cnblogs.com/rubylouvre/archive/2012/01/31/2332647.html

加支付宝好友偷能量挖...


原创文章,转载请注明出处:javascript cloneNode无法复制事件

评论(0)Web开发网
阅读(731)喜欢(0)JavaScript/Ajax开发技巧