Strange behavior when iterating over HTMLCollection from getElementsByClassName

吃可爱长大的小学妹 提交于 2019-11-26 09:51:12

问题


I wrote a function to change the class of elements to change their properties. For some reason, only some of the elements have changed. It took me a few hours to find a solution, but it seems odd to me. Perhaps you can explain this to me.

This isn’t working:

function replace(){
  var elements = document.getElementsByClassName(\'classOne\');

  for (var i = 0; i < elements.length; i++) {
    elements[i].className = \'classTwo\';               
  }
}

See the JSFiddle: only every second item is affected; only every second red element changes color to blue.

So I changed the final expression of the for loop to not increment i anymore:

function replace(){
  var elements = document.getElementsByClassName(\'classOne\');

  for (var i = 0; i < elements.length; i) { // Here’s the difference
    elements[i].className = \'classTwo\';               
  }
}

This works well! It seems as though push is called and no increment is needed. Is this normal? It is different from the examples I’ve seen.


回答1:


What's going on is an odd side effect. When you reassign className for each element of elements, the element gets removed from the array! (Actually, as @ user2428118 points out, elements is an array-like object, not an array. See this thread for the difference.) This is because it no longer has the classOne class name. When your loop exits (in the second case), the elements array will be empty.

You could write your loop as:

while (elements.length) {
    elements[0].className = 'classTwo'; // removes elements[0] from elements!
}

In your first case, by incrementing i, you are skipping half of the (original) elements that have class classOne.

Excellent question, by the way. Well-researched and clear.




回答2:


getElementsByClassName returns a NodeList. A NodeList collection is a live collection, which means that the modification of the document affects the collection. more




回答3:


Or revert the loop, beginning by length-1 and step down to 0



来源:https://stackoverflow.com/questions/15562484/strange-behavior-when-iterating-over-htmlcollection-from-getelementsbyclassname

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!