$.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() 中的选择器为啥不能引用超出当前 $ 范围的树?的主要内容,如果未能解决你的问题,请参考以下文章