Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 禁用DOM中元素的属性_Javascript_Dom - Fatal编程技术网

Javascript 禁用DOM中元素的属性

Javascript 禁用DOM中元素的属性,javascript,dom,Javascript,Dom,我使用cloneNode(true)来复制DOM元素(例如,一个包含一些跨度的div,这些跨度包含文本,并且可能是嵌套的)。我想从副本中删除所有id属性,以便document.getElementById将找到原始项 我该怎么做节点.setAttribute('id','')似乎可以工作,但我想知道这是删除它,还是简单地将其id设置为零长度字符串(这仍然意味着我有许多具有相同id的元素) 此外,我还想知道如何递归地擦除id,以便确保副本中的所有id都被擦除,这样我就可以安全地继续按id引用项目(

我使用
cloneNode(true)
来复制DOM元素(例如,一个包含一些跨度的div,这些跨度包含文本,并且可能是嵌套的)。我想从副本中删除所有id属性,以便
document.getElementById
将找到原始项

我该怎么做<代码>节点.setAttribute('id','')似乎可以工作,但我想知道这是删除它,还是简单地将其id设置为零长度字符串(这仍然意味着我有许多具有相同id的元素)

此外,我还想知道如何递归地擦除id,以便确保副本中的所有id都被擦除,这样我就可以安全地继续按id引用项目(当然是原件)。到目前为止,我有以下几点:

function recursive_erase_id(node) {
    node.setAttribute('id','');
    var children = node.childNodes;
    if (children) recursive_erase(children);
}

怎么样?

要回答第一个问题,您需要使用removeAttribute(名称),而不是将属性设置为空字符串。您可以通过setAttribute在复制时设置新属性,但我建议在删除旧属性后再设置

第二个问题涉及复制时删除属性。也许创建这样的自定义函数可以解决复制时的问题:

var customClone = function(el) {
    var newElement = el.cloneNode(true);
    newElement.removeAttribute('id'); // set later on?
}

希望这能提供一些指导。

至于递归,这应该是可行的(尽管未经测试):

函数递归擦除id(节点){ 如果(node.removeAttribute){//或node.nodeType==node.ELEMENT\u node //甚至node.nodeType==1(IE和Opera没有定义nodeType常量!) node.removeAttribute('id'); } var children=node.childNodes; for(var i=0,j=children.length;i我在这里构建了。它使用
removeAttribute
和一个递归函数从原始文件中删除id。另一种方法是将id设置为null。两者都有效。如果你摆弄小提琴;-)并使用浏览器中的dom inspector检查克隆的元素,您将看到所有克隆不再具有id。

还要注意的是,
cloneNode()
方法不会复制添加到dom中的JavaScript属性 节点,例如事件处理程序。此方法仅复制属性,并且可以选择, 子节点。其他一切都失去了。IE有一个bug,事件处理程序也在其中
已克隆,因此建议在克隆之前删除事件处理程序。

将其视为已测试。工作起来很有魅力。我确实想知道为什么我的foreach循环不起作用。@Steven Lu Great:)我认为你的foreach循环的问题在于你从来没有创建过一个(或者至少从来没有在这里发布过)<代码>递归_擦除(子项)将使用
节点列表调用
recursive\u erase
-很难说
recursive\u erase
是如何实现的:)并非所有节点都包含
removeAttribute
方法,因此您必须对此进行测试。@Kooilnc您说得对,谢谢
removeAttribute
属于
元素
,该元素是
节点
的子类型。威尔会修好的。哦,我刚才看到了。是的,我在这里复制的版本在很多方面都有缺陷。我最终发现了我的问题所在。因为迭代器是一个整数,所以我需要使用它来索引,而不仅仅是使用那个整数。
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.
    }
}