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

Javascript 如何从父div中删除div列表?,javascript,dom,parent,children,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]); } } var divs = parent.getElementsByTagName("div

我对JavaScript有问题

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

var divs = parent.getElementsByTagName("div");
if(divs != null)
{
    for(var v = 0; v < divs.length; v++)
    {
        parent.removeChild(divs[v]);
    }
}
var divs = parent.getElementsByTagName("div");
if(divs != null)
{
    for(var v = 0; v < divs.length; v++)
    {
        parent.removeChild(divs[0]);
    }
}
var divs=parent.getElementsByTagName(“div”);
如果(divs!=null)
{
对于(var v=0;v
但问题是,JS并没有删除所有的div。JS只删除列表的一半

我也试过:

var divs = parent.getElementsByTagName("div");
if(divs != null)
{
    for(var v = 0; v < divs.length; v++)
    {
        parent.removeChild(divs[v]);
    }
}
var divs = parent.getElementsByTagName("div");
if(divs != null)
{
    for(var v = 0; v < divs.length; v++)
    {
        parent.removeChild(divs[0]);
    }
}
var divs=parent.getElementsByTagName(“div”);
如果(divs!=null)
{
对于(var v=0;v
但结果是一样的


请帮忙?

你为什么不试试下面的方法呢:

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
像您和其他人的代码一样,则会为任何子代引发异常-

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

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

我没有想到这一点——这是在另一个回答/评论区决定的。

你为什么不试试这样的方式呢:

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
像您和其他人的代码一样,则会为任何子代引发异常-

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

while (divs[0]) {
    divs[0].parentNode.removeChild(divs[0]);
}
我没有想到这一点——这是在另一个回答/评论区决定的。

两种解决方案:

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]);
    }
}
var divs=parent.getElementsByTagName(“div”);
如果(divs!=null)
{
对于(变量v=0,len=divs.length;v
两种解决方案:

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]);
    }
}
var divs=parent.getElementsByTagName(“div”);
如果(divs!=null)
{
对于(变量v=0,len=divs.length;v
getElementsByTagName返回的列表是活动的。这意味着它会随着删除DOM对象而更新,因此每个周期的长度都不相同

这是一个例子

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



这是一个。父对象是窗口对象。。向我们显示完整的代码…您确定使用
getElementsByTagName
找到的所有div都是父div的实际子级吗?而不可能是父母的后代?如果他们是后代,我不确定删除第一个后代的行为是否正常。它将删除父项的所有子项。也许您还需要删除所有嵌套的
元素?而且我认为
divs
永远不会是
null
getElementsByTagName
返回的值是一个
HTMLCollection
——从技术上讲是一个数组。因此,您需要检查
.length>0
,而不是
null
@ianpgall:Correct。
null
检查没有意义<如果找不到任何元素,code>getElementsByTagName
将返回一个空列表。另外,循环处理列表已为空的情况。
parent
是窗口对象。。向我们显示完整的代码…您确定使用
getElementsByTagName
找到的所有div都是父div的实际子级吗?而不可能是父母的后代?如果他们是后代,我不确定删除第一个后代的行为是否正常。它将删除父项的所有子项。也许您还需要删除所有嵌套的
元素?而且我认为
divs
永远不会是
null
getElementsByTagName
返回的值是一个
HTMLCollection
——从技术上讲是一个数组。因此,您需要检查
.length>0
,而不是
null
@ianpgall:Correct。
null
检查没有意义<如果找不到任何元素,code>getElementsByTagName
将返回一个空列表。另外,循环会处理列表已经为空的情况。+1但是活动列表上的
.length
会重新计算,而且有点昂贵。我会这样做:
while(divs[0])parent.removeChild(divs[0])@user1689607:很公平。说得好。我会更新我的答案。哦,我明白为什么了。每个div可能有不同的父级。无法从问题中判断。如果找到的div是后代而不是孩子,则此操作无效。它将抛出一个异常。不能只在任何节点上使用
parent.removeChild
——请注意,实际的子div是如何首先被删除的,但嵌套的子div会引发一个异常(在浏览器控制台中)。@MattBurland:
div
可能是
parent
的更深层嵌套后代
parent.removeChild
仅适用于一个级别的深度。+1但活动列表上的
.length
会重新计算,而且有点昂贵。我会这样做的