我想知道哪个选项更好,特别是从速度方面考虑:
$('#id tag')...
或者$('#id').find('tag')...
另外,如果你将id
和/或tag
更改为类似于class
或input:checked
之类的内容,是否适用相同的答案呢?
例如,哪个更好:$('#id input:checked')...
还是$('#id').find('input:checked');
?
我想知道哪个选项更好,特别是从速度方面考虑:
$('#id tag')...
或者$('#id').find('tag')...
另外,如果你将id
和/或tag
更改为类似于class
或input:checked
之类的内容,是否适用相同的答案呢?
例如,哪个更好:$('#id input:checked')...
还是$('#id').find('input:checked');
?
$('#id').find('inner')
语法,因为它更准确地描述了它实际正在执行的操作。$('#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中上下文和子集选择器性能的更多信息。子集id 通常 是最佳选择。当然,你可能会得到不同的结果,但在大多数情况下,他们是如此。
因此,从我的角度来看,子集选择器比上下文选择器快3倍。
这里是测试用例HTML,我要查找所有在#i
元素下的span
元素:
<div id="i">
<span>testL1_1</span>
<span>testL1_2</span>
<div>
<span>testL2_1</span>
</div>
<ul>
<li>
<span>testL3_1</span>
</li>
</ul>
<div>
<div>
<div>
<div>
<span>testL5_1</span>
</div>
</div>
</div>
</div>
</div>
测试这三个jQuery选择器:
$("#i span"); // much slower
$("#i").find("span"); // FASTEST
$("span", "#i"); // second fastest
http://jsperf.com/jquery-sub-element-selection
在Google Chrome和Firefox中测试,结果表明.find()
是最快的,其次是第三种情况,而第一种情况则慢得多。
这里的性能指标为::)
==> http://jsperf.com/find-vs-descendant-selector
看起来descendant
的方式略快,但在Opera上表现不佳,
总之,在我看来,这并不重要:)
希望这回答了您的问题,并请查看此处Is .find() faster than basic descendant selecting method?
:P
@Nick 很高兴这很清楚,我建议你应该自己进行性能测试,如果你寻找内存泄漏,它会变得更有趣 :P
是的,我说了ML这个词 :)
兄弟! - Tats_innit:)
请随意 DV,但还是谢谢你,兄弟! - Tats_innit$("#id tag")
在现代浏览器上比第二个选择器($("#id").find("tag")
)要慢得多;请参考此处的测试,以下是屏幕截图。IE7(缺少querySelectorAll
)以大致相同的速度运行它们。实际上这几乎不可能有任何影响。如果您没有调试实际已知的性能问题,请不要担心。
合成基准测试结果总是值得怀疑的。如果您正在处理实际已知的性能问题,请分析那个(您实际的选择器和您实际的标记)。
Descendant performs better. check for this link Jsperf .
$("tag", "#id");
在进行性能测试时,请确保您尝试所有三种选项。 - Robert KoritnikquerySelectorAll
的浏览器和不支持的浏览器之间会有很大的差异。 - James Allardice