【问题标题】:jQuery reports no direct descendants of documentjQuery 报告没有文档的直接后代
【发布时间】:2012-02-23 20:52:00
【问题描述】:

我目前正在使用 jQuery 1.6.1。在 Firebug 中,我看到了:

console.log($(document).find("*"))

做我所期望的;它返回文档的所有孩子。但是这个:

console.log($(document).find("> *"))

没有。它返回一个空集!在我看来,如果文档有后代,那么它必须至少有一个直系后代。 jQuery 显然不同意。这是一个错误,还是我的误解?另请注意:

console.log($("body").find("> *"))

符合我的预期,它返回 body 标记的直接后代。提前感谢您的任何见解!

【问题讨论】:

  • 注意:$("> elem", context) 选择器将在未来的版本中被弃用。因此不鼓励使用它来代替使用替代选择器。 来源: api.jquery.com/child-selector
  • 有趣。你知道什么会取而代之吗?有时只选择下一级后代至关重要。
  • @dnuttle:您始终可以使用.children() 方法选择子级。当然,选择器 a > b 将像以前一样工作。
  • @dnuttle 选择下一级后代?你是说孩子吗?嗯,那样的话可能是.children():p
  • 好的...呃。谢谢你们俩。

标签: jquery document descendant


【解决方案1】:

document 确实(至少)有一个孩子,这是一个 HTMLHtmlElement(它继承了 HTMLElement 的形式),所以是的,理论上,jQuery(或本例中的 Sizzle)应该返回这个。

这是一个错误吗?这可能是一个设计决定。但是让我们看看$(document).children() 给了我们什么:

alert($(document).children().length);

输出1。

有趣的是$(document).find("> html") 返回一个空集,而$(document).find("html") 返回HTMLHtmlElement。但下面是true:

$(document).find("html").parent()[0] === document

至少在 jQuery 中是一个不一致的地方。 .find('> *') 应该返回与 .children() IMO 相同的元素。

可能是 Sizzle 或 jQuery 中的错误(有足够时间的人可以查看 Sizzle's source code [source] 并找出问题所在)。

另一方面,可以说子选择器仅适用于Element 节点,而document 不是Element 节点。从这个角度来看,没有bug,只是这个不一致。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2019-04-23
    • 2012-04-30
    相关资源
    最近更新 更多