Javascript getElementsByClassName不返回固定答案

Javascript getElementsByClassName不返回固定答案,javascript,getelementsbyclassname,Javascript,Getelementsbyclassname,在Javascript中,我使用以下方法获取给定类的元素: A = document.getElementsByClassName("someclass"); > A contains elements e1, e2, e3, e4 然后,我更改其中一个元素的类: document.getElementById("e2").className = "anotherclass"; 令我大吃一惊的是,数组A在这个过程中被自动更改了 > A contains elements e1,

在Javascript中,我使用以下方法获取给定类的元素:

A = document.getElementsByClassName("someclass");
> A contains elements e1, e2, e3, e4
然后,我更改其中一个元素的类:

document.getElementById("e2").className = "anotherclass";
令我大吃一惊的是,数组A在这个过程中被自动更改了

> A contains elements e1, e3, e4
我认为
getElementsByClassName
返回的数组在分配后将保持不变

  • 这怎么可能?这是故意的行为吗
  • 有没有一个简单的方法来改变这一点
这是一本书


请注意,对于
getElementById

也是如此,这是因为
A
不是
数组
getElementByClassName
返回由于文档中的更改而实时更新的

将类似数组的对象转换为数组的最简单方法是:

var A = ...

// With ES5 code
var A_array = Array.prototype.slice.call(A);

// With ES6 code
var A_array = Array.from(A);
或者您可以通过
querySelectorAll
获取
NodeList
,而这不会实时更新

var A = document.querySelectorAll('.someclass');

这是因为
A
不是
数组
getElementByClassName
返回由于文档中的更改而实时更新的

将类似数组的对象转换为数组的最简单方法是:

var A = ...

// With ES5 code
var A_array = Array.prototype.slice.call(A);

// With ES6 code
var A_array = Array.from(A);
或者您可以通过
querySelectorAll
获取
NodeList
,而这不会实时更新

var A = document.querySelectorAll('.someclass');

这是因为
A
不是
数组
getElementByClassName
返回由于文档中的更改而实时更新的

将类似数组的对象转换为数组的最简单方法是:

var A = ...

// With ES5 code
var A_array = Array.prototype.slice.call(A);

// With ES6 code
var A_array = Array.from(A);
或者您可以通过
querySelectorAll
获取
NodeList
,而这不会实时更新

var A = document.querySelectorAll('.someclass');

这是因为
A
不是
数组
getElementByClassName
返回由于文档中的更改而实时更新的

将类似数组的对象转换为数组的最简单方法是:

var A = ...

// With ES5 code
var A_array = Array.prototype.slice.call(A);

// With ES6 code
var A_array = Array.from(A);
或者您可以通过
querySelectorAll
获取
NodeList
,而这不会实时更新

var A = document.querySelectorAll('.someclass');
这些函数返回活动节点列表。这意味着它们会自动更新以反映DOM的当前内容

请参阅。

这些函数返回活动节点列表。这意味着它们会自动更新以反映DOM的当前内容

请参阅。

这些函数返回活动节点列表。这意味着它们会自动更新以反映DOM的当前内容

请参阅。

这些函数返回活动节点列表。这意味着它们会自动更新以反映DOM的当前内容



请参阅。

FYI,如果您不希望返回的
nodeList
处于活动状态(如答案所述),可以切换到使用
document.queryselectoral()
,它返回静态
nodeList
,并且比
document.getElementsByClassName()具有更好的浏览器支持
@jfriend00-但更改类不会在非活动节点列表中更新。我回答了同样的问题,但随后对其进行了测试,似乎非活动节点列表在实际DOM更改的程度上是静态的,如添加/删除子节点等@adeneo:您的演示显示了列表中的所有四个元素(在Firefox中测试)。@adeneo-非活动节点列表只不过是一个静态节点列表。它不会改变。请看这里的控制台:当然,它显示了控制台中的所有四个元素,但是如果您查看问题,OP正在更改类,并且它在活动节点列表中更新,但在非活动节点列表中也会发生这种情况。控制台显示所有四个元素,第二个元素上的类被更改。如果添加或删除元素,这将是对DOM结构的实际更改,这不会反映在非活动节点列表中,因此我在上面给出了评论。仅供参考,如果您不希望返回的
nodeList
处于活动状态(如答案所述),可以切换到使用
document.querySelectorAll()
它返回一个静态的
节点列表
,并且比
document.getElementsByClassName()
@jfriend00具有更好的浏览器支持,但不会在非活动节点列表中更新类。我回答了同样的问题,但随后对其进行了测试,似乎非活动节点列表在实际DOM更改的程度上是静态的,如添加/删除子节点等@adeneo:您的演示显示了列表中的所有四个元素(在Firefox中测试)。@adeneo-非活动节点列表只不过是一个静态节点列表。它不会改变。请看这里的控制台:当然,它显示了控制台中的所有四个元素,但是如果您查看问题,OP正在更改类,并且它在活动节点列表中更新,但在非活动节点列表中也会发生这种情况。控制台显示所有四个元素,第二个元素上的类被更改。如果添加或删除元素,这将是对DOM结构的实际更改,这不会反映在非活动节点列表中,因此我在上面给出了评论。仅供参考,如果您不希望返回的
nodeList
处于活动状态(如答案所述),可以切换到使用
document.querySelectorAll()
它返回一个静态的
节点列表
,并且比
document.getElementsByClassName()
@jfriend00具有更好的浏览器支持,但不会在非活动节点列表中更新类。我回答了同样的问题,但随后对其进行了测试,似乎非活动节点列表在实际DOM更改的程度上是静态的,如添加/删除子节点等@adeneo:您的演示显示了列表中的所有四个元素(在Firefox中测试)。@adeneo-非活动节点列表只不过是一个静态节点列表。它不会改变。请看这里的控制台:当然,它显示了控制台中的所有四个元素,但如果您查看问题,OP正在更改类,并且它在live nodeList中更新,但这在非-