getElementsByClassName - 奇怪的行为

时间:2013-03-22 03:58:46

标签: javascript getelementsbyclassname

首先,抱歉我的英语不好......

我写了一个函数来改变元素类来改变它们的属性。 出于某种原因,只有一些元素发生了变化,我花了几个小时才找到解决方案,但他对我来说似乎很奇怪,也许你可以向我解释。

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';               
   }
}

这很好用!似乎是'推'被称为,并且不需要系数...... 这是正常的?它与我见过的例子不同。

提前致谢!

3 个答案:

答案 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