使用jQuery查找链接时document.links更快吗?

时间:2010-04-01 11:49:51

标签: javascript jquery dom

这是否更快:

$(document.links).filter('a.someClass')

不仅仅是简单的旧:

$('a.someClass')

我在jQuery的代码中没有看到document.links的使用情况 它会立即为您提供文档上的链接集合,
而且,看起来,只是过滤收集品会更快 而不是所有DOM节点,这是更多的节点。

5 个答案:

答案 0 :(得分:8)

我刚刚开始测试,在Chrome上运行选择器1000次。

$(document.links).filter('a.someClass')需要672毫秒才能运行1000次。

$('a.someClass')需要191毫秒才能运行1000次。

如果你这样做

$('a').filter('.someClass')然而,运行需要652毫秒;所以filter似乎是失去时间的地方。

不幸的是,{p> var x = $('.remove', document.links);花了13秒;所以最好不要使用那种变化:P

答案 1 :(得分:4)

理论上,迭代document.links将比jQuery的Sizzle选择器库快一点。但是:

  • 不是你使用filter的方式,这给jQuery提供的工作量与使用Sizzle首先选择元素所需的工作量相同;

  • document.links不一定会与$('a')完全相同,因为a-without-href不会出现在links集合中。

  • 直接$('a.someClass')方法比在现代浏览器中手动迭代document.links要快得多,因为该方法只会将控制转移到浏览器自己的document.querySelectorAll('a.someClass')实现,这比你自己或Sizzle自己在DOM节点上嗅探的速度要快得多。

(有一个稍微快于querySelectorAll的方法,jQuery还没有使用它:document.getElementsByClassName('someClass')。同样,它只在现代浏览器中使用,IE8没有它在哪里有querySelectorAll。在实践中,由于querySelectorAll已经非常快,因此可能不值得打扰太多。)

答案 2 :(得分:1)

不要猜测jQuery。很多人花了很多时间来加快速度。如果document.links是查找<a>代码的好方法,那么Sizzle会自动为您执行此操作。

那说(好吧,键入),这样做肯定会更好:

$('a.someClass')

大于

$('.someClass')

如果您可以使用标签名称对选择器进行限定,那么您的状况会更好。引擎将使用getElementsByTagName()来减少要扫描的节点数。

答案 3 :(得分:0)

我不熟悉sizzle选择器库的工作方式,但我怀疑你{j}将使用$('a.someclass')之类的东西检索所有锚点而不是遍历整个DOM。document.getElementByTagName('A') / p>

正如Pointy所说,嘶嘶声是非常快速和高度优化的,找出更好的方法是运行自己的基准测试

答案 4 :(得分:0)

我刚刚在这里进行了测试:http://jsbin.com/ixiva3

动态创建了1000个链接。 此测试需要firebug(使用console.time

结果显示$("a.somelink")是最快的。