如何从父div中删除div列表?

时间:2012-10-30 16:57:55

标签: javascript dom parent children

我遇到了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]);
    }
}

但结果相同

请帮帮忙?

3 个答案:

答案 0 :(得分:3)

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

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

这是fiddle

答案 1 :(得分: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来删除父节点的实际。如果div[v]是一个后代(你知道,就像嵌套在另一个元素中 - 而不是div - 它是parent的实际子元素)。这是在您引用元素时删除元素的安全方法。您保证元素的父节点正在删除它,因此是有效的。如果您检查控制台是否尝试使用parent.removeChild,例如您和其他代码,那么任何后代都会抛出异常 - http://jsfiddle.net/ujaSv/

虽然重要的是要指出for循环的更好的替代方案是:

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

我没有想到这种光彩 - 这是在另一个答案/评论区域中决定的。

答案 2 :(得分: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]);
    }
}