Get All Elements By ClassName and Change ClassName

The problem is that the NodeList returned to you is “live” – it changes as you alter the class name. That is, when you change the class on the first element, the list is immediately one element shorter than it was.

Try this:

  while (elementArray.length) {
    elementArray[0].className = "exampleClassComplete";
  }

(There’s no need to use setAttribute() to set the “class” value – just update the “className” property. Using setAttribute() in old versions of IE wouldn’t work anyway.)

Alternatively, convert your NodeList to a plain array, and then use your indexed iteration:

  elementArray = [].slice.call(elementArray, 0);
  for (var i = 0; i < elementArray.length; ++i)
    elementArray[i].className = "whatever";

As pointed out in a comment, this has the advantage of not relying on the semantics of NodeList objects. (Note also, thanks again to a comment, that if you need this to work in older versions of Internet Explorer, you’d have to write an explicit loop to copy element references from the NodeList to an array.)

Leave a Comment