我试图删除具有特定类名的元素,但它不起作用。知道为什么吗?
function delete_elems(){
var my_elems = document.getElementsByClassName("my_elem");
for(k=0; k<my_elems.length; k++){
my_elems[k].parentElement.removeChild(my_elems[k]);
}
}
我也尝试过:
function delete_elems(parentElem){
var my_elems = document.getElementsByClassName("my_elem");
for(k=0; k<my_elems.length; k++){
parentElem.removeChild(my_elems[k]);
}
}
答案 0 :(得分:4)
答案 1 :(得分:4)
getElementsByClassName方法返回一个活动节点列表,因此使用索引对其进行迭代并同时修改列表(通过从文档中删除节点)意味着当删除元素时,列表会被修改所以从一个包含10个成员的列表开始,只有一个被删除后才会有9个。如果删除项目0,则所有项目都会重新编入索引,因此项目1现在为0,2为1,依此类推为8(因为只剩下9项)。
正如Molle博士所指出的那样,你可以通过从最后遍历列表来避免这个问题。
你可以完全避免使用反击:
var el;
while ((el = my_elems[0])) {
el.parentNode.removeChild(el);
}
请注意,在使用NodeList时,每次删除元素时,浏览器都必须重新生成列表(无论使用上述哪种方法),因此nodeList较大时此方法可能会很慢。
你可以通过首先将列表转换为数组(简单地遍历它)来避免这种情况,在这种情况下,您可以使用递增或递减计数器,而不必担心列表中缺少成员(因为它在未修改时)元素从文档中删除。)