我正在尝试从表单中删除(几乎)所有节点。我设法使用以下代码从表单中删除所有节点:
var form;
form = document.getElementById(id);
while (form.hasChildNodes())
form.removeChild(form.lastChild);
但是,这还不够,因为我将添加一些逻辑来保留某些节点。因此,我需要使用 for loop
删除节点。我尝试使用以下代码:
var form, formNodes, totalNodes, i;
form = document.getElementById(id);
formNodes = form.childNodes;
totalNodes = formNodes.length;
for (i = 0; i < totalNodes; i++)
form.removeChild(formNodes[i]);
一些节点被删除,但我收到此错误:
Uncaught TypeError: Failed to execute 'removeChild' on 'Node': parameter 1 is not of type 'Node'
考虑formNodes
仅包含节点,可能导致错误的原因是什么?
编辑
我尝试使用以下代码向后循环:
var form, formNodes, totalNodes, i;
form = document.getElementById(id);
formNodes = form.childNodes;
totalNodes = formNodes.length;
for (i = totalNodes - 1; i >= 0; i--)
form.removeChild(formNodes[i]);
它会删除所有节点。我将从 i
中减去一个偏移变量这样我就能够保留某些节点。
编辑
我的问题不同,因为我试图从表单中删除节点,而不是使用 getElementsByTagName
获取段落元素。一个node
与 element
不同。我的问题的解决方案可能相似,但问题不一样。
最佳答案
当您删除子节点时,childNodes
属性会更新。
因此,一旦删除一半的子节点,您的索引将超过更新后的 NodeList 的末尾。
您应该向后循环(以便索引永远不会调整)或提前复制到数组。或者继续删除第一个子节点,直到 NodeList 为空。
关于javascript - 从表单中删除节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44527146/