Javascript removechild循环在完成之前退出
我有下面一段代码,它在类名为foo的文档中查找所有元素,然后将它们全部删除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++) {
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
,以获得更大的通用性,以防您需要处理不是
元素直接子元素的元素