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无法复制事件