这与问题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树进行深层复制。
我在这里错过了什么吗?
答案 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);