6

这与问题javascript cloneNode 和 properties有关。

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

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

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

theClone不包含任何属性“独裁者”。

我无法找到任何解释为什么会这样。MDN 上的文档声明cloneNode“复制其所有属性及其值”,这一行直接取自DOM 规范本身。

这对我来说似乎很糟糕,因为它几乎不可能对包含自定义属性的 DOM 树进行深层复制。

我在这里错过了什么吗?

4

3 回答 3

7

属性不等于属性。

请改用 setAttribute() 和 getAttribute()。

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

var theClone = theSource.cloneNode(true);
alert(theClone.getAttribute('dictator')); 
于 2012-08-07T21:27:24.073 回答
3

不是每个属性都对应一个属性。向元素添加自定义属性不会添加属性,所以当你这样做时会发生什么不在 DOM 规范中。

In fact, what happens when you add a property to a host object (such as a DOM node) is completely unspecified and is by no means guaranteed to work, so I'd strongly recommend against doing it. Instead, I'd suggest using wrappers if you want to extend the functionality of host objects (as jQuery and many other libraries do).

于 2012-08-07T22:16:19.220 回答
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。我从这个相当老的bugzilla 报告中运行了一个测试用例(见下文)。它在 Chrome 和 Firefox(都是最新版本)中不起作用。

//code from testcase @ bugzilla
var a = document.createElement("div");      
a.order = 50;      
alert(a.order);      
b = a.cloneNode(true);      
alert(b.order);    
于 2012-08-07T21:27:51.577 回答