哪个 jQuery 多元素选择器优化得更好

Posted

技术标签:

【中文标题】哪个 jQuery 多元素选择器优化得更好【英文标题】:Which jQuery selector for multiple elements is better optimized 【发布时间】:2019-08-13 17:16:58 【问题描述】:

我有一个根据 AJAX 调用返回的数据构建的动态表。在构建表格的函数结束时,我需要将 jQuery UI 包装器应用到表格中的一些锚元素,这些元素由“map-marker”和“th-list”图标标识。 这两个选项哪个优化得更好?

$("#tblResults tbody tr td").find("a[data-icon='map-marker'], a[data-icon='th-list']").button();

$("#tblResults tbody tr td a[data-icon='map-marker'], #tblResults tbody tr td a[data-icon='th-list']").button()

这个特定示例不会因为效率较低的方式而受到影响,但我在代码中的其他地方将回调函数应用于更大的表,这可能会有所不同。

【问题讨论】:

您需要测试它们以查看哪个性能更高。只看这两个,我会说第一个在 DOM 上性能更高,因为第二个 find() 在缩小的范围内运行,但第二个可能表现更好,因为它是单个操作。但这是你必须自己测试的东西,然后得出结论是否有任何时差如此重要。 并参考 Optimize Selectors 获取有关该主题的一些 jQuery 文档。 从我在大型 DOM 上的经验来看,这两者都不是最好的,尤其是这是真的。但是,请同时添加 html,以便我们在这里更好地为您提供帮助。 【参考方案1】:

参考这里:https://***.com/a/16423239/125981 现在这不是您的问题的完全重复,但将有助于解释您的问题作为补充。

第二个并不好,因为它会做这一切(我描述)两次,所以不是那个。现在如何实际改进第一个......

既然您提到了“多个”,那么我们首先获取对您的表的引用,然后将其缓存在一个变量中以避免多个 DOM 命中。

let myResultsThing = $('#tblResults');

现在我们有了 ID 引用的元素(这是最快的选择器)

为什么?让我们谈谈那个。这里使用的 Sizzle 引擎使用从右到左的选择器,所以 $("#tblResults tbody tr td") 表示的是 1. 查找所有 td,2. 过滤 td 中的 tr,3. 过滤那些对于 tbody 内的那些 4. 过滤那些落在由 id #tblResults 表示的元素内的那些

现在,如果您有 10 个表,每个表有 100 个td,每行有 10 行,每行有 3 个tbody,您会发现这是一项相当繁忙的工作。因此,通过首先隔离 ID,我们将很快消除 90% 以上的工作量。

好的,我们在上面有我们的表格引用方式。使用它我们可以找到tbody(或者更准确地说可能是多个tbody),从而消除页眉和页脚中的任何td

let myTbodies = myResultsThing.find('tbody')
//get into the rest of it
.find('tr td').find("a[data-icon='map-marker'], a[data-icon='th-list']").button();

现在我可能倾向于实际测试上述所有内容

myResultsThing.find("a[data-icon='map-marker'], a[data-icon='th-list']").button();

根据您的 DOM 的具体外观,您可能会缓存(就像我在表格中所做的那样)清除到 TD 或 A 元素选择器,但我将把它留给您作为练习,因为我们在这里没有可以推测的标记.

【讨论】:

以上是关于哪个 jQuery 多元素选择器优化得更好的主要内容,如果未能解决你的问题,请参考以下文章

jQuery的选择器—基本选择器

jquery 中多条件选择器,相对选择器,层次选择器的区别

优化jQuery选择器

jQuery 选择器:获取子集的哪个更快?

高性能jquery的几种优化

jQuery学习笔记之选择器