我正在使用 JQuery 和 JQuery mobile,不幸的是我需要使用 $.find() 方法来搜索元素的所有后代。
很多时候,我知道只有一个结果。但是 find 方法会在找到可能很早的匹配项后继续遍历整个树。您的第一个想法可能是我应该导航到我期望元素所在的位置,但这对于我的某些查询来说确实是不可能的。
有什么方法可以像 $.find() 那样进行完整的后代搜索,在识别出第一个匹配项后停止搜索?
我正在使用 JQuery 和 JQuery mobile,不幸的是我需要使用 $.find() 方法来搜索元素的所有后代。
很多时候,我知道只有一个结果。但是 find 方法会在找到可能很早的匹配项后继续遍历整个树。您的第一个想法可能是我应该导航到我期望元素所在的位置,但这对于我的某些查询来说确实是不可能的。
有什么方法可以像 $.find() 那样进行完整的后代搜索,在识别出第一个匹配项后停止搜索?
这取决于您的选择器是什么。除非您使用的是 jquery 特定的选择器或诸如.someclass
,#someid
或之类的选择器,否则div
jquery 会将选择器直接传递给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它被搁置了,因为它似乎并没有真正导致显着的性能提升.
只需使您的选择器足够具体,然后使用第一种方法。
$('yourselector').first()
或者,如果您已经知道结果最多为一个,您实际上可以用一个 ID 或一个有点独特的类来装饰 dom 中的这个特殊元素。
请记住,CSS 搜索是按照您的选择器指定的顺序从“右到左”执行的,因此它实际上停止的速度比您想象的要快。
这完全取决于您的 CSS 选择器的具体程度。