Javascript 何时使用querySelectorAll
在我编写的一段示例代码中Javascript 何时使用querySelectorAll,javascript,dom,qsa,dom4,Javascript,Dom,Qsa,Dom4,在我编写的一段示例代码中 var as = toArray(document.getElementsByClassName("false")).filter(function (el) { return el.tagName === "A"; }); 我想我可以用 var as=document.querySelectorAll(“a.false”) 现在在阅读了以下事实之后 假装浏览器支持不是问题(我们有填隙片和多边形填充) 假设您的jQuery不是通用的,您应该使用QSA来获取每
var as = toArray(document.getElementsByClassName("false")).filter(function (el) {
return el.tagName === "A";
});
我想我可以用
var as=document.querySelectorAll(“a.false”)代码>
现在在阅读了以下事实之后
- 假装浏览器支持不是问题(我们有填隙片和多边形填充)
- 假设您的jQuery不是通用的,您应该使用QSA来获取每个元素
- 我要写
qsa
而不是document.querySelectorAll
,因为我很懒
问题:我什么时候应该支持QSA而不是常规方法
很明显,如果您执行qsa(“a”)
或qsa(“.class”)
或qsa(“#id”)
操作,那么您就错了,因为有更好的方法(byTagName、byClassName、byId)
很明显,qsa(“div>p.magic”)
是一个合理的用例
问题:但是qsa(“tagName.class”)
是qsa的一个很好的用例吗
除此之外,还有一些东西叫做
我问了一个关于的问题,如果浏览器支持不是问题,我会在任何地方使用它。如果可以只使用一种方法,为什么要使用4种不同的方法(…byId,…byTagName,…byClassName)
QSA似乎是(…),但仍然只需要几毫秒或更少的时间。大多数时候,你只打了几次电话,所以这不是问题。当你遇到速度瓶颈时,你总是可以用合适的另一个替换QSA。我已经为你设置了一些测试。看来QSA要慢得多。但是,如果你不这么说,这应该不是一个问题
编辑-jsperf版本
当gEBI、gEBN、gEBCN因选择器复杂而无法工作时,应使用QSA
QSA与DOM解析是一个偏好问题,您将如何处理返回的数据集。作为一个旁白,我想说,在getElementsByTagNameAndClassName()
可用之前,querySelectorAll(“a.false”)
是有意义的,并且比toArray()的链式调用更可读
到filter()
@FrédéricHamidi对.filter
的额外调用也非常慢。事实上,在一个假设的getElementsByTagNameAndClassName()
出现之前,除了querySelectorAll()
之外,你没有太多的选择,是不是?你说的较慢是指大约慢两百倍。我已经知道对于简单的选择器,QSA是愚蠢的(如前所述)@Raynos,你不应该只看彼此的相对速度。你应该看看一个呼叫需要多少毫秒。因此,在FX7中,getElementById取0.0001ms,QSA取0.02ms。除非您需要选择数千个元素,否则最终用户不会注意到任何差异。哇!毫秒数!0.02毫秒是慢的。那是整整20微秒。我最多要做100微秒的计算,为什么要100微秒呢。人类最多只能探测200毫秒。所以你可以做很多JS,但仍然允许引擎在200毫秒内重新绘制页面。这完全取决于你在做什么。如果您所需要做的只是将一些基本逻辑附加到一个静态页面,那么对QSA进行几个调用就完全可以了,这将节省您的开发时间。如果要处理数千个DOM元素和一些复杂的逻辑,就必须考虑性能。我不会说做一个或另一个是“愚蠢的”,这取决于你需要什么。请使用jsperf.com进行此类测试。对不起,给你: