我正在使用cloneNode(true)
制作DOM元素的副本(例如包含一些包含文本并可能嵌套的跨度的div)。我想从副本中删除所有id属性,以便document.getElementById
找到原始项目。
我该怎么做? node.setAttribute('id','');
似乎有效,但我想知道这是否正在删除它,或者只是将其id设置为零长度字符串(这仍然意味着我有许多具有相同id的元素)。
此外,我想知道我如何递归地删除id,以便我可以确保擦除所有副本中的ID,因此我可以安全地继续通过id继续引用项目(当然是原件)。到目前为止,我有这个:
function recursive_erase_id(node) {
node.setAttribute('id','');
var children = node.childNodes;
if (children) recursive_erase(children);
}
答案 0 :(得分:1)
答案 1 :(得分:1)
至于递归,这应该可行(但未经测试):
function recursive_erase_id(node) {
if (node.removeAttribute) { // Or node.nodeType == Node.ELEMENT_NODE
// Or even node.nodeType == 1 (IE and Opera does not define the NodeType constants!)
node.removeAttribute('id');
}
var children = node.childNodes;
for (var i = 0, j = children.length; i < j; i++) {
recursive_erase_id(children.item(i)); // Depth-first.
}
}
答案 2 :(得分:1)
我在这里构建了a fiddle。它使用removeAttribute
和递归函数从原始中删除id。另一种方法是将id设置为null。两者都有效。如果你摆弄小提琴;-)并使用浏览器中的dom检查器检查克隆元素,你会看到所有克隆都不再有id。
答案 3 :(得分:0)
要回答第一个问题,您需要使用removeAttribute(name),而不是将属性设置为空字符串。您可以在通过setAttribute复制时设置新属性,但我建议您在删除旧属性后执行此操作。
您的第二个问题涉及复制时删除属性。也许创建这样的自定义函数可以解决复制时的问题:
var customClone = function(el) {
var newElement = el.cloneNode(true);
newElement.removeAttribute('id'); // set later on?
}
希望提供一些指导。
答案 4 :(得分:0)
另请注意,cloneNode()
方法不会复制您添加到DOM的JavaScript属性
节点,例如事件处理程序。此方法仅复制属性,并且可选地,
子节点。其他一切都丢失了。 IE有一个错误,事件处理程序也是
克隆,因此建议在克隆之前删除事件处理程序。