禁用DOM中元素的属性

时间:2011-04-28 06:20:25

标签: javascript dom

我正在使用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);
}

5 个答案:

答案 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有一个错误,事件处理程序也是 克隆,因此建议在克隆之前删除事件处理程序。