何时使用querySelectorAll

时间:2011-10-29 19:32:08

标签: 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获取每个元素。
  • 我打算写qsa而不是document.querySelectorAll,因为我很懒。

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

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

同样清楚qsa("div > p.magic")是一个明智的用例。

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

除此之外,还有一些名为NodeIterator

的东西

我问了一个关于QSA vs NodeIterator

的问题

3 个答案:

答案 0 :(得分:2)

当gEBI,gEBN,gEBCN无效时,你应该使用QSA,因为你的选择器很复杂。

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

我为你准备了一些测试。看起来QSA要慢很多。但如果你没有那么称呼它,那应该不是问题。

http://jsfiddle.net/mxZq3/

编辑 - jsperf版

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