为什么cloneNode会排除自定义属性?

时间:2012-08-07 21:17:54

标签: javascript properties clonenode

这与问题javascript cloneNode and properties有关。

我看到了同样的行为。 Node.cloneNode不会复制我自己添加的任何属性(来自原始帖子的代码):

    var theSource = document.getElementById("someDiv")
    theSource.dictator = "stalin";

    var theClone = theSource.cloneNode(true);
    alert(theClone.dictator); 

theClone不包含任何属性“dictator”。

我无法找到解释原因的原因。 documentation on MDN表示cloneNode“复制了所有属性及其值”,这一行直接来自DOM specification本身。

这似乎让我感到不安,因为它几乎不可能对包含自定义属性的DOM树进行深层复制。

我在这里错过了什么吗?

3 个答案:

答案 0 :(得分:7)

属性不等于属性。

改为使用setAttribute()和getAttribute()。

var theSource = document.getElementById("someDiv")
theSource.setAttribute('dictator','stalin');

var theClone = theSource.cloneNode(true);
alert(theClone.getAttribute('dictator')); 

答案 1 :(得分:3)

并非每个属性都对应一个属性。向元素添加自定义属性不会添加属性,因此当您执行此操作时会发生的情况不在DOM规范中。

事实上,当您向宿主对象(例如DOM节点)添加属性时会发生什么情况完全未指定,并且无法保证可以正常工作,因此我强烈建议您不要这样做。相反,如果你想扩展主机对象的功能(如jQuery和许多其他库那样),我建议使用包装器。

答案 2 :(得分:2)

经过测试。 cloneNode 在克隆中包含自定义属性,但无法直接检索该属性。尝试:

 var theSource = document.getElementById("someDiv")
 theSource.dictator = "stalin";
 //or better / more cross browser compatible
 theSource.setAttribute('dictator','stalin');

 var theClone = theSource.cloneNode(true);
 alert(theClone.getAttribute('dictator')); //so, use getAttribute 

克隆expando properties可能是浏览器问题。我从这个相当古老的testcase开了一个bugzilla report(见后面)。它在Chrome和Firefox(两个最新版本)中均无效。

//code from testcase @ bugzilla
var a = document.createElement("div");      
a.order = 50;      
alert(a.order);      
b = a.cloneNode(true);      
alert(b.order);