2012-06-21 119 views
3

我有下面的代码段,用于查找与类名FOO文档中的所有元素,然后将其删除所有removeChild之循环退出之前完成

 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]); 
       } 
     } 

Forexample,所述items.length是3和之后的函数退出运行一个循环,当长度为8时,它将退出3.任何帮助将不胜感激。另外,当我一次又一次地运行函数时,它最终会删除所有元素。

回答

7

的问题是,items现场NodeList,即当你访问列表(items.length)的属性,列表重新评估(元素被再次搜索)。
由于您在此期间删除了元素,因此列表变短,但您保留索引。

您可以在NodeList转换为数组第一:当你删除DOM元素

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

数组大小不会改变。

10

你的问题是由getElementsByClassName()返回的NodeList是活的。无论是将它转换成一个数组首先作为费利克斯暗示或向后遍历:

var items = doc.getElementsByClassName('foo'); 
var i = items.length; 
while (i--) { 
    items[i].parentNode.removeChild(items[i]); 
} 

这工作,因为从列表中删除的项目每次迭代是列表中的最后一项,因此不影响较早的项目。

为了更大程度的通用性,我还将doc.body更改为items[i].parentNode,以防您需要处理不是<body>元素的直接子元素。

相关问题