这是有关这个问题的JavaScript cloneNode和属性 。
我看到相同的行为。 Node.cloneNode不超过我自己添加(代码从原来的职位)的任何属性复制:
var theSource = document.getElementById("someDiv")
theSource.dictator = "stalin";
var theClone = theSource.cloneNode(true);
alert(theClone.dictator);
theClone
不含任何财产“独裁者”。
我一直没能找到为什么是这样的情况下,任何的解释。 在上MDN文档指出cloneNode
“所有的属性及属性值的副本”,这是直接取自线DOM规范本身。
因为它使得它几乎不可能做到这一点包含自定义属性DOM树的深层副本,这似乎打破了我。
我失去了一些东西在这里?
属性是不等于一个属性。
使用的setAttribute()和的getAttribute()来代替。
var theSource = document.getElementById("someDiv")
theSource.setAttribute('dictator','stalin');
var theClone = theSource.cloneNode(true);
alert(theClone.getAttribute('dictator'));
并不是每一个属性对应的属性。 添加自定义属性的元素不添加属性,所以,当你这样做是不包括在DOM规范时会发生什么。
事实上,什么,当你添加一个属性到主机的对象(如DOM节点)是完全不确定的,并且是不保证工作手段发生,所以我强烈反对这样做。 相反,我倒是建议,如果你想延长主机对象的功能(如jQuery和许多其他图书馆一样)使用的包装。
测试了。 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);