Javascript 是否从窗体中删除节点?

Javascript 是否从窗体中删除节点?,javascript,forms,for-loop,dom,nodes,Javascript,Forms,For Loop,Dom,Nodes,我正在尝试从表单中删除(几乎)所有节点。我使用以下代码从表单中删除了所有节点: var form; form = document.getElementById(id); while (form.hasChildNodes()) form.removeChild(form.lastChild); var form, formNodes, totalNodes, i; form = document.getElementById(id); formNodes = form.childNo

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

var form;
form = document.getElementById(id);
while (form.hasChildNodes())
    form.removeChild(form.lastChild);
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]);
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]);
但是,这还不够,因为我将添加一些逻辑来保留某些节点。因此,我需要使用
for循环
删除节点。我尝试了以下代码:

var form;
form = document.getElementById(id);
while (form.hasChildNodes())
    form.removeChild(form.lastChild);
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]);
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
获取段落元素。
节点
元素
不同。我的问题的解决方案可能类似,但问题不同。

删除子节点时,
childNodes
属性会更新

因此,一旦删除了一半的子节点,索引将超过已更新节点列表的末尾


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

删除子节点时,
childNodes
属性会更新

因此,一旦删除了一半的子节点,索引将超过已更新节点列表的末尾


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

这是因为
form.childNodes
返回一个
实时集合
,您可以使用
querySelectorAll()

var form=document.getElementById(“表单”);
var formNodes=form.querySelectorAll('*');
var totalNodes=formNodes.length;
对于(i=0;i
自定义逻辑

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++;
    } 
}
var form=document.getElementById(“表单”);
var formNodes=form.childNodes;//居住
var totalNodes=formNodes.length;
var=0;
对于(变量i=0;i
这是因为
form.childNodes
返回一个
实时集合
,您可以使用
queryselectoral()
代替:

var form=document.getElementById(“表单”);
var formNodes=form.querySelectorAll('*');
var totalNodes=formNodes.length;
对于(i=0;i
自定义逻辑

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++;
    } 
}
var form=document.getElementById(“表单”);
var formNodes=form.childNodes;//居住
var totalNodes=formNodes.length;
var=0;
对于(变量i=0;i
在节点列表为空之前,我无法一直删除第一个子节点,因为我将添加逻辑以保留某些节点。我尝试反向运行循环,但没有成功。我已经在我的编辑中展示了这一点。向后运行应该可以。使用调试器查看它在做什么。我忘记将
++
更改为
--
,因此它当然不起作用。在节点列表为空之前,我不能一直删除第一个子节点,因为我将添加逻辑以保留某些节点。我尝试反向运行循环,但没有成功。我已经在我的编辑中展示了这一点。向后运行应该可以。使用调试器查看它在做什么。我忘了将
++
更改为
--
,因此它当然不起作用。您的代码删除了几乎所有节点,但留下了一些文本。您的代码删除了几乎所有节点,但留下了一些文本。编辑后您还有问题吗?我知道,我刚刚发现了错误并编辑了我的问题。@trincot。我仍在决定最好的解决方案。我可以使用
Array.prototype.slice
。倒着运行for循环会更简单,但效率更高。编辑后你还有问题吗?我知道,我刚刚发现了错误并编辑了我的问题。@trincot。我仍在决定最好的解决方案。我可以使用
Array.prototype.slice
。这样会更简单,但向后运行for循环会更有效。