1

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

//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 而不是全部。我假设长度也在不断变化,因此它无法覆盖所有孩子。

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

4

1 回答 1

2

你是对的:问题是当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是一个新功能,因此您应该为旧版浏览器提供 shim。

于 2017-02-09T07:42:30.617 回答