$.fn.find() 中的选择器为啥不能引用超出当前 $ 范围的树?

Posted

技术标签:

【中文标题】$.fn.find() 中的选择器为啥不能引用超出当前 $ 范围的树?【英文标题】:How come selectors in $.fn.find() cannot reference the tree beyond the current $ scope?$.fn.find() 中的选择器为什么不能引用超出当前 $ 范围的树? 【发布时间】:2013-06-01 06:04:35 【问题描述】:

在 jQuery 中

$('html head').length                             // 1

$('html').find('head').length                     // 1

$('html').find('head').filter('html head').length // 1

但是

$('html').find('html head').length                // 0

为什么?

【问题讨论】:

把这个留在这里:$('html').andSelf().find('html head').length @epascarello 谢谢!我会接受这个答案,TBH — 通过尝试$('body').andSelf().find('html p').length === 0,我意识到 jQuery 基本上忽略了当前范围之外的所有内容,以达到find 的目的。 我真的不明白这是什么意思。为什么不直接使用: $(document).find('html head').length 呢? 也许我很密集,但如果 find() 不在上下文中搜索,它的目的是什么? @Mathletics 绝对应该!例如,我不希望$('html').find('html body') 检索任何东西。但是html head 描述的元素总是在html 的上下文中。 【参考方案1】:

因为<html>标签内没有嵌套<html>标签

但是:

$('html').find('html, head').length // return 1 here coz comma means 'or'

【讨论】:

我不是在寻找html 标记,我在寻找head 标记,它是html 标记(即html head)在@987654328 内的后代@ 标签。本质上,我想要与前 3 个表达式返回的相同的东西。 那么只要:$('html').find('head') 为什么不用呢? $.fn.find() 中的选择器为什么不能引用超出当前 $ 范围的树? html head head 的后代。事后看来,使用html && head 是一个糟糕的例子——太简单了。这里没有任何目的——问题就在标题中:老实说,看在上帝的份上,我并没有试图找到html 标签(不过,在赞成票上做得很好!)。【参考方案2】:

根据文档:

查找:获取当前匹配元素集中每个元素的后代,由选择器、jQuery 对象或元素过滤。

HTML 不是HTML 的后代

http://api.jquery.com/find/

【讨论】:

【参考方案3】:

您的第一个选择器 $('html head') 的工作方式与 find 类似 - 获取 HTML 的任何 <head> 后代

HTML──┐ 从这里开始找head
    头

您的第二个选择器 $('html').find('head') 获取 html 元素 - 然后找到所有后代 <head> 元素

HTML──┐ 从这里开始找head
    头

您的第三个选择器 $('html').find('head').filter('html head') 获取 html 元素 - 然后找到所有后代 <head> 元素 - 过滤器真的毫无意义,因为返回的 head 元素保证是 html 的后代,因为 $('html').find('head')

HTML──┐ 从这里开始找head
    头

你最后一个不工作的$('html').find('html head') 正在搜索下面的结构

HTML──┐ 从这里开始,找到“html head”
    HTML──┐
         头
但实际上你的结构是这样的
HTML──┐
    头

哪个 html 没有后代 html 元素,因此返回 0 个元素

如果您想将 HTML 元素保留在集合中,您可以使用 .addBack()

$('html') // get html element
  .find('html head') // find head element
  .addBack() // add back the html element
  // if jQuery 1.7 and lower use .andSelf()
  .length  // this will result in 1 element - the HTML element

【讨论】:

以上是关于$.fn.find() 中的选择器为啥不能引用超出当前 $ 范围的树?的主要内容,如果未能解决你的问题,请参考以下文章

表单中的 SwiftUI 选择器 - 索引超出范围

为啥我不能在选择器视图列表中选择我的第一个数据?

xamarin 表单 - 与选择器的两种方式绑定 - 为啥我不能从后面的代码更新选择器?

为啥数据库中的表不能修改保存

为啥我不能引用我的类库?

为啥 const 方法不能返回非常量引用?