首先,抱歉我的英语不好......
我写了一个函数来改变元素类来改变它们的属性。 出于某种原因,只有一些元素发生了变化,我花了几个小时才找到解决方案,但他对我来说似乎很奇怪,也许你可以向我解释。
function replace(){
var elements = document.getElementsByClassName('classOne');
for (var i=0; i<elements.length;i++) {
elements[i].className = 'classTwo';
}
}
不能正常工作,Demo here,[在chrome 25和FF上],所以我采用了循环系数:
function replace(){
var elements = document.getElementsByClassName('classOne');
for (var i=0; i<elements.length;i) { //----here the different --- i without ++
elements[i].className = 'classTwo';
}
}
这很好用!似乎是'推'被称为,并且不需要系数...... 这是正常的?它与我见过的例子不同。
提前致谢!
答案 0 :(得分:19)
发生了什么是奇怪的副作用。当您为className
的每个元素重新分配elements
时,该元素将从数组中删除! (实际上,正如@ user2428118指出的那样,elements
是类似数组的对象,而不是数组。请参阅this thread了解差异。)这是因为它不再具有classOne
班级名称。当你的循环退出时(在第二种情况下),elements
数组将为空。
您可以将循环编写为:
while (elements.length) {
elements[0].className = 'classTwo'; // removes elements[0] from elements!
}
在第一种情况下,通过递增i
,您将跳过一半具有类classOne
的(原始)元素。
顺便说一句,很棒的问题。经过精心研究和清晰。
答案 1 :(得分:5)
getElementsByClassName
返回NodeList。 NodeList集合是一个实时集合,这意味着文档的修改会影响集合。 more
答案 2 :(得分:-3)
或者恢复循环,从长度-1开始,然后逐步降低到0