9

在我写的一段示例代码中

var as = toArray(document.getElementsByClassName("false")).filter(function (el) {
    return el.tagName === "A";
});

我在想我可以用

var as = document.querySelectorAll("a.false");

现在在阅读以下事实后

  • 假装浏览器支持不是问题(我们有 shims 和 polyfills)。
  • 假装你不在你的通用 jQuery 思维模式中,你应该使用 QSA 来获取每个元素。
  • 我要写qsa而不是document.querySelectorAll因为我很懒。

问题:我什么时候应该优先使用 QSA 而不是常规方法?

很明显,如果你做错了,或者qsa("a")你做错了,因为有更好的方法(byTagName、byClassName、byId)。qsa(".class")qsa("#id")

很明显,这qsa("div > p.magic")是一个合理的用例。

问题:但是qsa("tagName.class")QSA 是一个好的用例吗?

此外,还有这些东西叫做NodeIterator

我问了一个关于QSA 与 NodeIterator的问题

4

3 回答 3

2

当 gEBI、gEBN、gEBCN 不起作用时,您应该使用 QSA,因为您的选择器很复杂。

QSA 与 DOM 解析是一个偏好问题,以及您将如何处理返回的数据集。

于 2011-11-07T04:11:38.063 回答
1

如果浏览器支持不是问题,我会在任何地方使用它。如果只能使用一种,为什么要使用 4 种不同的方法(...byId、...byTagName、...byClassName)。

QSA 似乎更慢(... byId),但仍然只需要几毫秒或更短的时间。大多数时候你只调用它几次,所以不是问题。当您遇到速度瓶颈时,您总是可以用适当的另一个替换 QSA。

于 2011-10-29T20:44:31.357 回答
0

我已经为你设置了一些测试。看来QSA要慢得多。但是,如果您不这么称呼它,那应该不是问题。

http://jsfiddle.net/mxZq3/

编辑 - jsperf 版本

http://jsperf.com/qsa-vs-regular-js

于 2011-10-29T20:52:54.327 回答