Javascript removechild循环在完成之前退出

Javascript removechild循环在完成之前退出,javascript,dom,Javascript,Dom,我有下面一段代码,它在类名为foo的文档中查找所有元素,然后将它们全部删除 function(doc) { var items = doc.getElementsByClassName('foo'); alert(items.length); if(items.length>0) { for(var i=0;i<items.length;i++) {

我有下面一段代码,它在类名为foo的文档中查找所有元素,然后将它们全部删除

        function(doc) {
            var items = doc.getElementsByClassName('foo');
            alert(items.length);
            if(items.length>0) {
                for(var i=0;i<items.length;i++) {
                    alert(i);
                    doc.body.removeChild(items[i]);
                }
        }
功能(doc){
var items=doc.getElementsByClassName('foo');
警报(项目.长度);
如果(项目长度>0){

对于(var i=0;i而言,问题在于
是一个活动的
节点列表
,即每当访问列表的属性(
项.length
)时,都会重新计算列表(再次搜索元素)。
因为您同时删除了元素,所以列表会变短,但您保留了索引

您可以先将
节点列表
转换为数组:

var items = [].slice.call(doc.getElementsByClassName('foo'));

删除DOM元素时,数组大小不会更改。

您的问题是
GetElementsByCassName()
返回的
节点列表是活动的。请按照Felix的建议首先将其转换为数组,或者向后迭代:

var items = doc.getElementsByClassName('foo');
var i = items.length;
while (i--) {
    items[i].parentNode.removeChild(items[i]);
}
这是因为每次迭代从列表中删除的项是列表中的最后一项,因此不会影响以前的项

我还将
doc.body
更改为
items[I].parentNode
,以获得更大的通用性,以防您需要处理不是
元素直接子元素的元素