什么';Javascript选择器中live和not live集合的区别是什么?
我如何知道live和not live collection之间的区别 根据我的研究: Alive是:当DOM中的更改反映在集合中时。修改节点时,内容会发生更改 A不活动是:当DOM中的任何更改不影响集合的内容时 getElementsByCassName()是一个HTMLCollection,并且是活动的 getElementsByTagName()是一个HTMLCollection,并且是活动的 getElementsByName()是一个节点列表,是活动的 document.querySelectorAll()是节点列表,不是活动的 为什么document.querySelectorAll不活动? 我知道: HTMLCollection仅包含元素节点 节点列表包含元素节点和文本节点 这些什么';Javascript选择器中live和not live集合的区别是什么?,javascript,Javascript,我如何知道live和not live collection之间的区别 根据我的研究: Alive是:当DOM中的更改反映在集合中时。修改节点时,内容会发生更改 A不活动是:当DOM中的任何更改不影响集合的内容时 getElementsByCassName()是一个HTMLCollection,并且是活动的 getElementsByTagName()是一个HTMLCollection,并且是活动的 getElementsByName()是一个节点列表,是活动的 document.querySel
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。。。