从表单中删除节点? [复制]

Posted

技术标签:

【中文标题】从表单中删除节点? [复制]【英文标题】:Remove nodes from a form? [duplicate] 【发布时间】:2017-11-15 13:34:12 【问题描述】:

我正在尝试从表单中删除(几乎)所有节点。我设法使用以下代码从表单中删除了所有节点:

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]);

一些节点被删除,但我收到了这个错误:

未捕获的类型错误:无法在“节点”上执行“removeChild”:参数 1 不是“节点”类型

考虑到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 来获取段落元素。 nodeelement 不同。我的问题的解决方案可能类似,但问题不一样。

【问题讨论】:

修改后还有问题吗? 我知道,我刚刚发现了错误并编辑了我的问题。 @trincot 有点像。我仍在决定最佳解决方案。我可以使用Array.prototype.slice。它会更简单,但向后运行 for 循环会更有效。 【参考方案1】:

childNodes 属性会随着您移除子项而更新。

因此,一旦您删除了一半的子节点,您的索引将超过更新后的 NodeList 的末尾。

您应该向后循环(以便索引永远不会调整)或提前复制到数组。或者只是继续删除第一个孩子,直到 NodeList 为空。

【讨论】:

在 NodeList 为空之前,我无法继续删除第一个子节点,因为我将添加逻辑来保留某些节点。我尝试向后运行循环,但没有奏效。我已经在我的编辑中展示了这一点。 向后运行应该可以。使用调试器查看它在做什么。 我忘记将++ 更改为-- 所以它当然不起作用。【参考方案2】:

因为form.childNodes返回一个live collection,你可以用querySelectorAll()代替:

https://developer.mozilla.org/en-US/docs/Web/API/NodeList

var form = document.getElementById("form");
var formNodes = form.querySelectorAll('*');
var totalNodes = formNodes.length;
for (i = 0; i < totalNodes; i++) 
    formNodes[i].remove();

自定义逻辑

var form = document.getElementById("form");
var formNodes = form.childNodes; // live
var totalNodes = formNodes.length;
var removed = 0;
for (var i = 0; i < totalNodes; i++) 
    if (odds(i)) 
        form.removeChild(formNodes[i - removed]);
        removed++;
     

【讨论】:

您的代码几乎删除了所有节点,但留下了一些文本。

以上是关于从表单中删除节点? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何删除额外的节点

js的DOM节点操作:创建 ,插入,删除,复制,查找节点

javasript 的DOM 节点操作:创建,插入,删除,复制以及查找节点

[学习记录]二叉树删除

jQuery 删除复制节点

LeetCode-删除中间节点