jQuery:$(’#id tag’)与$(’#id’)。find(’tag’) – 哪个更好?
我想知道哪个选项更好,特别是在速度方面:
$('#id tag')...
要么
$('#id').find('tag')...
此外,如果您将id
和/或tag
更改为class
或类似input:checked
,则同样的答案是否适用?
例如,哪个更好: $('#id input:checked')...
或$('#id').find('input:checked');
?
您可以根据以下三点做出决定:
可读性
这与你的两个选择器没什么区别。 就我而言,我更喜欢$('#id').find('inner')
语法,因为它更准确地描述了它实际上在做什么。
可重用性
如果您的代码的其他部分使用相同的id选择器(或其上下文中的某些内容),则可以缓存选择器并重用它。 我自己发现重构像$('#id inner')
这样编写的代码更难,因为你必须首先解码css选择器才能继续前进并找到可能的改进。
想象一下这两个案例并不复杂
$('#hello .class_name tag').doThis(); $('#hello .other_name input').doThat();
而另一种情况
$('#hello').find('.class_name tag').doThis(); $('#hello').find('.other_name input').doThat();
我想第二个例子尖叫着你“缓存id选择器”,而第一个没有。
速度
性能始终是一个好点,在这种情况下,带有find
的id选择器在大多数浏览器中都能做得更好,因为它首先建立了上下文,并且可以将降序选择器应用于较小的元素子集。
如果您想了解有关jQuery中的context-vs子集选择器性能的更多信息,那么这是一个很好的性能测试 。 ids的子集通常是规则。 当然,你可以获得不同的结果,但在大多数情况下,他们会这样做。
因此,从我的观点来看,子集选择器为3到0。
这是测试用例HTML,我在#i
元素下查找所有span
元素:
testL1_1 testL1_2 testL2_1 - testL3_1
testL5_1
测试这三个jQuery选择器:
$("#i span"); // much slower $("#i").find("span"); // FASTEST $("span", "#i"); // second fastest
http://jsperf.com/jquery-sub-element-selection
我已经在谷歌Chrome和Firefox上运行了它。似乎.find()
紧随其后的是第三种情况,第一种情况要慢得多。
这里的绩效衡量: :)
==> http://jsperf.com/find-vs-descendant-selector
似乎descendant
方式很快,但在歌剧中表现不佳,
anyhoo在我看来没关系:)
希望这能回答你的问题并看到这里.find()比基本的后代选择方法更快吗?
后裔表现更好。 检查此链接Jsperf 。
- 如果您有太多嵌套元素。 然后去寻找。 这真的是一个小小的差异。
- 这只是你方便的编码方式。 我更喜欢如果有太多嵌套物品,那么我会去找,
看起来第一个$("#id tag")
比现代浏览器上的第二个( $("#id").find("tag")
)慢得多; 测试一下 ,见下面的截图。 IE7(缺少querySelectorAll
)以大致相同的速度运行它们。
但有两点意见:
-
它实际上不太重要。 如果您没有调试实际的已知性能问题,请不要担心。
-
综合基准测试总是令人怀疑。 如果您正在与实际的已知性能问题作斗争,请分析(您的实际选择器和实际标记)。