什么';Javascript选择器中live和not live集合的区别是什么?

什么';Javascript选择器中live和not live集合的区别是什么?,javascript,Javascript,我如何知道live和not live collection之间的区别 根据我的研究: Alive是:当DOM中的更改反映在集合中时。修改节点时,内容会发生更改 A不活动是:当DOM中的任何更改不影响集合的内容时 getElementsByCassName()是一个HTMLCollection,并且是活动的 getElementsByTagName()是一个HTMLCollection,并且是活动的 getElementsByName()是一个节点列表,是活动的 document.querySel

我如何知道live和not live collection之间的区别

根据我的研究:

Alive是:当DOM中的更改反映在集合中时。修改节点时,内容会发生更改

A不活动是:当DOM中的任何更改不影响集合的内容时

getElementsByCassName()是一个HTMLCollection,并且是活动的

getElementsByTagName()是一个HTMLCollection,并且是活动的

getElementsByName()是一个节点列表,是活动的

document.querySelectorAll()是节点列表,不是活动的

为什么document.querySelectorAll不活动?

我知道:

HTMLCollection仅包含元素节点 节点列表包含元素节点和文本节点

这些

document.getElementsByClassName()
document.getElementsByTagName()
document.getElementsByName()
是实时的,因为它们是引擎维护的内部集合的观察者。这种维护不是严格要求的,但很容易实现

document.querySelectorAll() 
不是活动的,因为每次请求时都会计算结果。 实时集合的维护成本太高,因为在这种情况下对DOM的每次修改(内容、属性、类)都需要重新评估集合中的每个元素-
O(N*M)
task,其中N是DOM中所有元素的数量(最坏情况)和M个活动
querySelectorAll()
收藏。

来自

集合是表示DOM节点列表的对象。A. 可以是动态的,也可以是静态的。除非另有说明 声明,必须是

如果是,则上的属性和方法 该对象必须在实际的基础数据上操作,而不是快照 数据的完整性

创建时,将关联筛选器和根 用它

然后,表示根在的子树的视图 的根,仅包含与给定 过滤器。视图是线性的。在没有具体要求的情况下 相反,中的节点必须按排序

使
querySelectorAll
返回静态
NodeList
的原因可能是允许使用更复杂的选择器

例如,选择器L4可能会引入伪类之类的内容。可能,因为它不能以合理的性能实现,所以它只能在
querySelectorAll
中使用,而不能在样式表中使用


如果
querySelectorAll
返回的集合是活动的,那么这些复杂的选择器将需要重新计算很多次,这将非常昂贵。

我也在想,但是CSS如何如此快速地应用这些选择器呢?不幸的是,它没有这么快。找出DOM中所有元素的所有样式是一个
O(N*S)
任务,其中N是许多DOM元素,S是许多样式规则(精确地说是选择器)。你可以在这里阅读我的文章:如果应用样式的速度足够快,那么不管它有多快/慢,为什么它不能足够快地维护一个集合?@dandavis如果只做一次,就可以找到与复杂选择器匹配的元素,但是每次修改DOM时重新计算它们的代价太高。CSS会在每次修改DOM时保持更新。我同意你的回答,这是有道理的,但它回避了一个问题,即样式表如何能够足够快地应用并保持应用…@dandavis是的,样式表就像是活的集合。这就是为什么像
:has()
这样昂贵的选择器将被允许出现在
querySelectorAll
中,但可能不会出现在样式表中。对于今天的样式表来说,很多已经足够好了。我不是想挑你的毛病,只是看起来像是敲诈JS。。。