如何匹配单个后代(如 $.find()),而无需在找到 DOM 树的其余部分后对其进行搜索
How do I match a single descendent (like $.find()) without searching through the rest of the DOM tree after it's found?
我正在使用JQuery和JQuery移动版,不幸的是,我需要使用$.find()方法来搜索元素的所有后代。
很多时候,我知道只会有一个结果。但是,在找到可能是非常早期的匹配项后,查找方法将继续遍历整个树。您的第一个想法可能是我应该导航到我期望元素的位置,但对于我的某些查询来说,这确实是不可能的。
有没有办法进行完整的后代搜索,例如 $.find() 在识别第一个匹配项后停止搜索?
这取决于您的选择器是什么。除非你使用的是 jquery 特定的选择器或选择器,如 .someclass
、#someid
或 div
,否则 jquery 会将选择器直接传递给使用浏览器选择器引擎来完成工作的element.querySelectorAll()
。因此,jquery 不会遍历所有元素,这意味着当它找到第一个元素时,没有办法让它"停止",它会找到所有元素然后给你所有元素。你可以改用element.querySelector()
并跳过jQuery,让浏览器只返回第一个匹配项,但这是否明显更快将取决于浏览器如何实现这些方法。(仅仅由于不使用jQuery,它总是会更快一些,但是从jsperf来看,使用querySelector
通常比使用querySelectorAll
更快)
现在,当涉及到包含仅jQuery选择器的选择器时,只需从.find
中省略这些仅jquery选择器,而是在.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
jQuery没有在jsperf中使用,但是由于jQuery选择元素的方式在很大程度上依赖于jsperf中使用的相同方法,我认为它是相关的。 例如,按 id 选择的 jQuery 选择器与按类选择的 jQuery 选择器应该看到与 getElementById
和 getElementsByClassName
之间相同的性能差异。
也
当前有一个功能请求,用于自动为您进行此切换的方法:http://bugs.jquery.com/ticket/11785 它被搁置,因为它似乎实际上并没有导致性能显着提高。
你能用.first()吗?
$('tag').first()
http://api.jquery.com/first/
只需使您的选择器足够具体,然后使用第一种方法。
$('yourselector').first()
或者,如果您已经知道结果最多是一个,那么您实际上可以使用 ID 或有点独特的类在 dom 中装饰这个特殊元素。
请记住,CSS 搜索是按照选择器指定的顺序从"右到左"执行的,因此它实际上会比您想象的更快停止。
这完全取决于您的CSS选择器的具体程度。
- 用程序搜索JQuery数据表中的文本
- 在html Select中添加搜索
- Ajax Live搜索发布到Laravel视图
- 谷歌放置API:按国家或餐馆名称搜索餐馆
- 学生搜索项目jquery/javascript
- 用于搜索的聚合物嵌套绑定
- 在javascript中搜索具有重复值的两个数组中的匹配值
- Angularjs-utils高亮过滤器在搜索时破坏应用程序
- 使用javascript搜索具有用户输入的数组
- 淘汰搜索/筛选
- 搜索api在mac上显示对话框
- AngularJS/HTML/Bootstrap元素用于动态搜索结果
- 谷歌水印未显示在自定义搜索框中
- 在javascript中搜索项目列表的性能
- 正在搜索JavaScript日期选择器滑块
- JQuery中的活动搜索栏
- 如何在剑道下拉列表中按文本和值搜索
- 谷歌CSE-搜索参数
- 如何让typeahead在我的搜索栏中填充自定义参数
- 如何使用提交按钮搜索表中的记录