我想知道以下哪个jQuery查询会更快。我希望匹配任何具有src属性或data-src属性的span标记。
var a = $('span[src],span[data-src]');
var b = $('span').filter('[src],[data-src]');
我的直觉是(b)但可能有一些我不知道的优化。
感谢。
更新:
基于100 x span[src]
,100 x span[data-src]
和100 x span
元素的快速测试:(a)大约快4到8倍,具体取决于浏览器。在IE8上它的速度要快得多(大约50次),在IE6 / 7上大约相同。
我想知道为什么它更快?
如果(a)jquery委托整个选择器查询可用的本地querySelectorAll
。因此,在现代浏览器上看起来速度较慢的查询实际上非常快。
答案 0 :(得分:1)
这只是一个假设,更多的是基于逻辑而不是测试。
在第一种情况下,选择器会选择span
src
属性。
在第二种情况下,选择器将选择所有span
,然后使用attr span
过滤src
。
所以,首先会更快。
如果我错了,请纠正我
答案 1 :(得分:1)
第一个版本将完成完整DOM树的两次传递;而第二个只一次。
真正的答案需要对您的具体情况进行分析,即取决于您的DOM的复杂程度。此外,不同的jQuery版本可能会导致不同的结果。
答案 2 :(得分:1)
在http://jsfiddle.net/B9Vmy/1/我运行了一些测试(使用firebug作为控制台的东西)
对于6000跨度(2000跨度,2000与src,2000,2000与data-src),这在大约8ms运行,因此选择部分是可忽略的。这么慢的原因是创建了jQuery对象(jQuery(element))。
虽然A仅对返回的结果只执行一次,但B对每个元素执行此操作,之后使用这些结果并对返回的结果再次执行此操作。
然后有可能用于选择元素的嘶嘶声引擎......看看过滤时间的笑声: - )