javascript - 正确遍历节点 - javascript childNodes

标签 javascript html dom removechild child-nodes

我正在尝试使以下代码为每个子节点工作一次。该函数还按照逻辑删除节点,对于多个子节点,它似乎永远不会遍历到每个子节点。

//Deleting from child node
            var target =document.getElementById(element.name).childNodes[0];            
            if(target.hasChildNodes())
            {
              var children = new Array();
              children = target.childNodes;
              for(child in children)
              {
                if(children[child].tagName == 'DIV'){
                    //target.removeChild[child];
                    var deleteChild = document.getElementById(target.childNodes[child].id);
                    deleteChild.parentNode.removeChild(deleteChild);
                }
              }
            }

在特殊情况下,我有 4 个“Div”作为子项,这只会删除两个 DIV,而不是全部。 我认为由于长度也在不断变化,因此它无法到达所有 child 。

这是正确的遍历方式吗?我是否遗漏了一些明显的东西?

最佳答案

您完全正确:问题是当您引用的 NodeList (target.childNodes) 处于事件状态时,您正在使用静态索引:它已更新当您删除其中一些子节点时。

最简单的方法是创建元素子节点的静态列表。您似乎正在尝试这样做,但 Javascript 具有动态类型,因此 var Children = new Array(); 本质上没有任何用处。它不会强制 NodeList 成为数组。你想要的功能是Array.from :

var children = Array.from(target.childNodes);
var child; // don't forget to declare this variable
for(child in children)
{
    if(children[child].tagName == 'DIV'){
        //target.removeChild[child];
        var deleteChild = target.childNodes[child]; // simplify
        deleteChild.parentNode.removeChild(deleteChild);
    }
}

请注意,Array.from 是一个新函数,因此您应该为旧版浏览器提供一个填充程序。

关于javascript - 正确遍历节点 - javascript childNodes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42130063/

相关文章:

javascript - JS - 将函数插入数组并为其命名

javascript - 在 Javascript 中,为什么在元素上设置 outerHTML 会将其 parentNode 设置为 'null' ?

javascript - 唯一的元素 ID,即使元素没有

javascript - 可以使用 Backbone 模型的 cid 作为 html id 属性吗?它保证是唯一的吗?

javascript - 折叠导航栏不适用于 HTML、CSS 和 JavaScript

javascript - 图片完整属性返回undefined

javascript - 为图像模式选择多个元素

javascript - 如何为 XMLHttpRequest 设置超时和 ontimeout?

javascript - 访问类的引用

javascript - Android、WebView 和 SpeechRecognition-API