4

我正在使用 JQuery 和 JQuery mobile,不幸的是我需要使用 $.find() 方法来搜索元素的所有后代。

很多时候,我知道只有一个结果。但是 find 方法会在找到可能很早的匹配项后继续遍历整个树。您的第一个想法可能是我应该导航到我期望元素所在的位置,但这对于我的某些查询来说确实是不可能的。

有什么方法可以像 $.find() 那样进行完整的后代搜索,在识别出第一个匹配项后停止搜索?

4

3 回答 3

4

这取决于您的选择器是什么。除非您使用的是 jquery 特定的选择器或诸如.someclass,#someid或之类的选择器,否则divjquery 会将选择器直接传递给element.querySelectorAll()使用浏览器的选择器引擎来完成工作的选择器。因此,jquery 不会遍历所有元素,这意味着当它找到第一个元素时无法让它“停止” ,它会找到所有元素然后给你所有元素。您可以改为使用element.querySelector()并跳过 jQuery,让浏览器只返回第一个匹配项,但这是否明显更快将取决于浏览器如何实现这些方法。(由于不使用 jQuery,它总是会更快一些,但是查看 jsperf 看起来它通常使用起来更快,querySelector而不是querySelectorAll)

现在,当涉及到包含仅 jQuery 选择器的选择器时,只需从您的中省略那些仅 jquery 选择器.find,而是在 a 中使用它们,.filter以便您element.querySelectorAll()首先使用更高效的选择器,然后仅通过仅 jQuery 选择器过滤结果。

例如,.find(".foo:button")将更有效地写为.find(".foo").filter(":button")

https://developer.mozilla.org/en-US/docs/Web/API/element.querySelector

http://jsperf.com/queryselectorall-vs-getelementbyid/35

jsperf 中没有使用 jQuery,但由于 jQuery 选择元素的方式很大程度上依赖于 jsperf 中使用的相同方法,我认为这是相关的。例如,按 id 选择的 jQuery 选择器与按类选择的 jQuery 选择器应该会看到与getElementById和之间相同的性能差异getElementsByClassName

此外,
目前有一个功能请求为您自动进行此切换的方法打开:http: //bugs.jquery.com/ticket/11785它被搁置了,因为它似乎并没有真正导致显着的性能提升.

于 2013-09-10T19:53:28.917 回答
0

只需使您的选择器足够具体,然后使用第一种方法。

$('yourselector').first()

或者,如果您已经知道结果最多为一个,您实际上可以用一个 ID 或一个有点独特的类来装饰 dom 中的这个特殊元素。

请记住,CSS 搜索是按照您的选择器指定的顺序从“右到左”执行的,因此它实际上停止的速度比您想象的要快。

这完全取决于您的 CSS 选择器的具体程度。

于 2013-09-10T19:40:34.793 回答
0

你可以使用 .first() 吗?

$('tag').first()

http://api.jquery.com/first/

于 2013-09-10T19:43:05.660 回答