Javascript 遍历GetElementsByCassName返回的元素并更改.className属性会产生奇怪的行为

Javascript 遍历GetElementsByCassName返回的元素并更改.className属性会产生奇怪的行为,javascript,Javascript,假设我调用getElementsByClassName并将结果存储在一个变量中,如下所示: var editButtons = document.getElementsByClassName("editButtonDisabled"); 然后,我遍历作为节点列表的变量,因此使用.itemi而不是[I],并更改每个项的类名: for (var i = 0; i < editButtons.length; i++) { var editButton = editButtons.it

假设我调用getElementsByClassName并将结果存储在一个变量中,如下所示:

var editButtons = document.getElementsByClassName("editButtonDisabled");
然后,我遍历作为节点列表的变量,因此使用.itemi而不是[I],并更改每个项的类名:

for (var i = 0; i < editButtons.length; i++) {

    var editButton = editButtons.item(i);
    editButton.className = "editButtonEnabled";

}
出于某种原因,循环跳过editButtons的所有奇数索引成员,只将类名更改应用于偶数的成员,就好像editButtons的长度正在通过更改其成员的属性而发生变化,在我看来,这不应该是预期的行为

我知道我可以通过先将所有元素放入一个数组,然后再次循环来解决这个问题,但这需要在只需要一个循环的情况下编写两个循环,我很好奇为什么它首先要这样做。

是的,因为每次迭代后editButtons.length都会发生变化,应将长度放入变量中:

for (var i = 0, length = editButtons.length; i < length; i++) {
    var editButton = editButtons.item(i);

    editButton.className = "editButtonEnabled";

}
钮扣{ 显示:块; 边缘底部:.5em; } .编辑按钮禁用{ 背景:红色; } .editButtonEnabled{ 背景:绿色; } 更改类名 按钮01 按钮02 按钮03 按钮04 按钮05 按钮06 按钮07 按钮08 按钮09
按钮10这还不够;你仍然在跳过更改的索引。我更好奇的是为什么editButtons.length会更改。因为我不再调用GetElementsByCassName,所以存储它返回的原始nodelist的变量不应该更改其长度,我希望是这样的。@Joey每次更改按钮的类名时,按钮都会从数组中删除,数组也会变小。但我的想法是错误的。我用一个反向迭代的例子更新了我的答案,这就是当你使用live collections时会发生的事情,反向迭代来解决问题,谢谢你解释并解决了它