jQuery 真正支持哪些 CSS3 选择器,例如:nth-last-child()?

Posted

技术标签:

【中文标题】jQuery 真正支持哪些 CSS3 选择器,例如:nth-last-child()?【英文标题】:What CSS3 selectors does jQuery really support, e.g. :nth-last-child()? 【发布时间】:2012-07-29 12:35:05 【问题描述】:

根据http://api.jquery.com/category/selectors/,我们可以在 jQuery 中使用大量的 CSS 选择器,但是例如那里没有提到:nth-last-child()。但是,当我测试以下内容时(使用来自 Google 的 jQuery 1.7.1),它实际上适用于 Firefox、Chrome 和 IE 9,但不适用于 IE 8 仿真模式下的 IE 9:

$('li:nth-last-child(2)').css('color', 'red');

那么发生了什么?看起来 jQuery 生成了 CSS 代码,例如 li:nth-last-child(2) color: red 并以某种方式注入了它,然后在支持使用的选择器的浏览器上运行正常。但这会很奇怪。

最重要的是,是否有一些技巧可以让 jQuery 在所有浏览器上都支持此类选择器?

【问题讨论】:

【参考方案1】:

虽然 jQuery 在其 home page 上宣传符合 Selectors level 3 标准,但它并没有完全实现该规范。在它自己的Selectors 文档中,它阐明它“[借用] CSS 1-3,然后[添加]它自己的”选择器。1

从 jQuery 1.9 开始,几乎所有 3 级标准中的选择器都被 Sizzle(其底层选择器库)支持,但以下情况除外:

jQuery 不能选择任何伪元素为they are CSS-based abstractions of the document tree that can't be expressed through the DOM。

jQuery 无法解析动态伪类,例如用于超链接的:link/:visited 和用于用户交互的:hover, :active and :focus。后一组伪类尤其是基于状态而不是基于事件的,因此当元素 enterleave 这些状态。有关说明,请参阅 this answer。

jQuery 也无法解析namespace prefixes,因为它不支持namespacing in CSS。

以下 3 级选择器 are implemented in jQuery 1.9 and newer,但 不是 jQuery 1.8 或更早版本2

:target :root :nth-last-child() :nth-of-type() :nth-last-of-type() :first-of-type :last-of-type :only-of-type

另外:

CSS2 中引入的:lang() 也不见了。

您的选择器似乎在 Firefox、Chrome 和 IE9 中工作的原因是 jQuery 在返回到 Sizzle 之前首先将选择器字符串传递给原生的 document.querySelectorAll() 实现。由于它是一个有效的 CSS 选择器,document.querySelectorAll() 将成功返回一个节点列表供 jQuery 使用,从而避免使用 Sizzle。

如果document.querySelectorAll() 失败,jQuery 会自动回退到 Sizzle。有多种情况可能导致它失败:

选择器无效、不受支持或无法使用(有关详细信息,请参阅Selectors API spec)。

不支持 document.querySelectorAll() 方法本身(jQuery 实际上用一个简单的 if 语句对此进行了测试,因此它不会 fail 在这个词的意义上,但你明白了)。

在您的情况下,虽然 IE9 和 IE8 实现了document.querySelectorAll(),但 IE8 不支持:nth-last-child()。由于 jQuery/Sizzle 也没有实现 :nth-last-child(),因此没有可使用的回退行为,导致 IE8 完全失败。

如果您至少无法将 jQuery 更新到 1.9(向后兼容的发布分支),您始终可以使用自定义选择器扩展来自己实现缺少的伪类。但是,由于 jQuery 1.9 在保持与旧 IE 版本的兼容性的同时增加了对上述选择器的支持,因此如果您需要兼容性,最好至少更新到该版本。


1它确实支持:contains(),最后在this old CR revision of the spec 中定义,后来被删除,以及从标准扩展:not()。 this question 中介绍了 jQuery 的实现与当前标准之间的差异。

2其他一些选择器(如 +~ 同级组合器、:empty:lang() 和一些 CSS2 属性选择器)将被删除为在 jQuery 的早期开发过程中很好,只是因为 John Resig didn't think anybody would use them。在进行了更多测试后,几乎所有这些都进入了最终版本。如上所述,:lang() 是唯一一个从未在 1.9 之前发布过的版本。

【讨论】:

当然,应该提到jQuery选择器可以使用:$.expr[':']['nth-last-child'] = function () ...; @zzzzBov:谢谢提醒!我在编辑中提到过,现在我正在尝试提出自己的实现...... @BoltClock 它在api.jquery.com/nth-of-type-selector 中说它“[借用] CSS 1-3,然后[添加]它自己的”选择器。 @Royi Namir:我的答案中已经有链接指向它所说的位置。看起来 jQuery 1.9 增加了对其他选择器的支持,所以我稍后将不得不更新这个答案。

以上是关于jQuery 真正支持哪些 CSS3 选择器,例如:nth-last-child()?的主要内容,如果未能解决你的问题,请参考以下文章

Jquery常用的选择器有哪些?

在 jQuery 中使用第 n 个子选择器是不是依赖于浏览器对 CSS3 的支持?

CSS3 选择器

jQuery之过滤选择器

在css3中这些选择器怎么用, E[A^=v] E[A$=v] E[A*=v] E:nth-child(n) E:nth-last-child

第一百六十五节,jQuery,过滤选择器