查找/儿童与后代选择器 jquery 性能差异

Posted

技术标签:

【中文标题】查找/儿童与后代选择器 jquery 性能差异【英文标题】:Find/Children vs descendant selector jquery performance differences 【发布时间】:2012-11-23 09:16:18 【问题描述】:

我试图理解为什么this jsperf test 中的一个 sn-ps 似乎比其他的慢得多。

这是四个sn-ps:

$(".menu-vertical li.selected > ul.static").show().parents().show();

$('ul.root').find('li.selected').children('ul.static').show().parents().show();

$("ul.root li.selected > ul.static").show().parents().show();

$('ul.root li.selected').children('ul.static').show().parents().show();

第二个似乎在所有浏览器中始终较慢,我不明白为什么。

【问题讨论】:

我给出了两个性能示例 1) find() vs Direct Child(>) 选择器 vs 子选择器性能测试 1 [jsperf.com/jquery-child-selector-vs-find/2][link1] 2) find() vs 后代选择器 vs 子选择器性能测试2 [jsperf.com/jquery-child-selector-vs-find/9][link2] [链接1]:jsperf.com/jquery-child-selector-vs-find/2 [链接2]:jsperf.com/jquery-child-selector-vs-find/9 【参考方案1】:

是什么让第二个与众不同?

$('ul.root')               // you get the collection of all `ul.root`
    .find('li.selected')   // in each collection you search for `li.selected`
    .children('ul.static') // you get `ul.static` children elements of each found
    ...

注意您需要进行多少次迭代。在所有其他示例中,大部分搜索都是在单个查询中执行的,计算速度要快很多倍。

【讨论】:

在使用 find 时是否有更有效的方法来获得相同的结果? (或者改正我的问题,既然它更慢,为什么还要使用 find ?) @GeorgeKatsanos 通常单个选择器执行得更快。但是,在某些情况下,find 可能是灵丹妙药。所以,我的回答是:视情况而定。 在这里浏览了许多类似的问题后,假设场景的基准测试似乎没有多大帮助,因为结果因 html、浏览器、机器等而异。 @GeorgeKatsanos 正是如此。【参考方案2】:

孩子的数量很重要。

有很多(比如 >10)个孩子$el.find('> selector') 表现更好

有几个孩子$el.children('selector') 表现更好。

这是因为 children() 会遍历所有子元素来测试给定的选择器。

【讨论】:

以上是关于查找/儿童与后代选择器 jquery 性能差异的主要内容,如果未能解决你的问题,请参考以下文章

jquery中的缓存与链式选择器?

jQuery 查找标签

jQuery之层次选择器

CSS 性能:后代选择器还是两个直接后代选择器最好?

jQuery九类选择器

jQuery 选择器(只选择目标,没有后代)