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()紧随其后的是第三种情况,第一种情况要慢得多。

jQuery选择器性能

这里的绩效衡量: :) ==> http://jsperf.com/find-vs-descendant-selector

似乎descendant方式很快,但在歌剧中表现不佳,

anyhoo在我看来没关系:)

希望这能回答你的问题并看到这里.find()比基本的后代选择方法更快吗?

后裔表现更好。 检查此链接Jsperf 。

  1. 如果您有太多嵌套元素。 然后去寻找。 这真的是一个小小的差异。
  2. 这只是你方便的编码方式。 我更喜欢如果有太多嵌套物品,那么我会去找,

正如我所说 – 它在浏览器中有所不同。

铬:

http://i.stack.imgur.com/SijQY.jpg 在此处输入图像描述

http://i.stack.imgur.com/axhGw.jpg 在此处输入图像描述

看起来第一个$("#id tag")比现代浏览器上的第二个( $("#id").find("tag") )慢得多; 测试一下 ,见下面的截图。 IE7(缺少querySelectorAll )以大致相同的速度运行它们。

但有两点意见:

  1. 它实际上不太重要。 如果您没有调试实际的已知性能问题,请不要担心。

  2. 综合基准​​测试总是令人怀疑。 如果您正在与实际的已知性能问题作斗争,请分析(您的实际选择器和实际标记)。

结果截图