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.
}
}