这是否更快:
$(document.links).filter('a.someClass')
不仅仅是简单的旧:
$('a.someClass')
我在jQuery的代码中没有看到document.links
的使用情况
它会立即为您提供文档上的链接集合,
而且,看起来,只是过滤收集品会更快
而不是所有DOM节点,这是更多的节点。
答案 0 :(得分:8)
我刚刚开始测试,在Chrome上运行选择器1000次。
$(document.links).filter('a.someClass')
需要672毫秒才能运行1000次。
$('a.someClass')
需要191毫秒才能运行1000次。
如果你这样做
$('a').filter('.someClass')
然而,运行需要652毫秒;所以filter
似乎是失去时间的地方。
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")
是最快的。