0

我的 JavaScript 有问题。

我需要从父 div 中删除一个 div 列表。所以我尝试了这个:

var divs = parent.getElementsByTagName("div");
if(divs != null)
{
    for(var v = 0; v < divs.length; v++)
    {
        parent.removeChild(divs[v]);
    }
}

但问题是,JS 并没有删除所有的 div。JS 只删除列表的一半。

我也试过这个:

var divs = parent.getElementsByTagName("div");
if(divs != null)
{
    for(var v = 0; v < divs.length; v++)
    {
        parent.removeChild(divs[0]);
    }
}

但结果相同

请帮忙?

4

3 回答 3

3
var divs = parent.getElementsByTagName("div");
while(divs[0]) {
    divs[0].parentNode.removeChild(divs[0])
}

getElementsByTagName 返回的列表是live。这意味着它会在您删除 DOM 对象时更新,因此每个周期的长度都不相同。

这是一个小提琴

于 2012-10-30T17:07:23.603 回答
1

你为什么不尝试类似的东西:

var divs = parent.getElementsByTagName("div");
if (divs.length > 0) {  // Technically unnecessary, as the for loop just won't run if there aren't any elements returned
    for (var v = divs.length; v >= 0; v--) {
        divs[v].parentNode.removeChild(divs[v]);
    }
}

为了解释为什么这是正确的,removeChild必须使用 来删除父节点的实际子节点。Ifdiv[v]是一个后代(你知道,就像嵌套在另一个元素内 - 不是一个 div - 这是一个实际的子元素parent)。这是在引用元素时删除元素的安全方法。您保证元素的父节点正在删除它,因此是有效的。如果您检查控制台是否尝试parent.removeChild像您和其他代码一样使用,则会为任何后代抛出异常 - http://jsfiddle.net/ujaSv/

尽管重要的是要指出 for 循环的更好替代方法是:

while (divs[0]) {
    divs[0].parentNode.removeChild(divs[0]);
}

我没有想到这种辉煌 - 这是在另一个答案/评论区决定的。

于 2012-10-30T17:06:25.833 回答
1

两种解决方案:

1:倒计时

var divs = parent.getElementsByTagName("div");
if(divs != null)
{
    for(var v = divs.length - 1; v >= 0; v--)
    {
        parent.removeChild(divs[0]);
    }
}​

2:缓存长度:

var divs = parent.getElementsByTagName("div");
if(divs != null)
{
    for(var v = 0, len = divs.length; v < len; v++)
    {
        parent.removeChild(divs[0]);
    }
}
于 2012-10-30T17:06:29.500 回答