当前位置: 首页 > 面试题库 >

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

琴俊良
2023-03-14
问题内容

根据介绍,我们可以在jQuery中使用大量CSS选择器,但:nth-last-child()此处未提及。但是,当我测试以下内容(使用Google的jQuery1.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在所有浏览器上都支持此类选择器?


问题答案:

尽管jQuery在其主页上宣传了对选择器3级标准的符合性,但它并未完全实现该规范。在其自己的选择器文档中,它阐明了它是“从CSS1–3借用],然后[添加]自己的”选择器。

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

  • jQuery无法选择任何伪元素,因为它们是无法通过DOM表示的文档树的基于CSS的抽象。

  • jQuery无法解析动态伪类,例如:link/,:visited用于超链接和:hover:active以及:focus用于用户交互。后一组伪类尤其基于状态,而不是基于事件,因此当元素 进入离开 这些状态时,您需要使用事件处理程序而不是伪类来运行代码。

  • jQuery也无法解析名称空间前缀,因为它不支持CSS中的命名空间。

以下级别3选择器在jQuery1.9和更高版本中实现,但 jQuery1.8或更高版本2中未实现:

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

另外:

  • :lang()CSS2中引入的,也丢失了。

您的选择器似乎可以在Firefox,Chrome和IE9上运行的原因是,jQuery首先将选择器字符串传递给本机document.querySelectorAll()实现,然后才退回到Sizzle。由于它是有效的CSS选择器,因此document.querySelectorAll()将成功返回jQuery使用的节点列表,从而避免使用Sizzle。

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

  • 选择器无效,不受支持或无法使用(有关详细信息,请参见Selectors API规范)。

  • document.querySelectorAll()方法本身不受支持(jQuery实际上使用一个简单的if语句对此进行了测试,因此在这种意义上它不会 失败 ,但是您可以理解)。

就您而言,尽管IE9和IE8实现了document.querySelectorAll(),但IE8不支持:nth-last- child()。由于jQuery / Sizzle均未实现:nth-last-child(),因此没有可使用的后备行为,从而导致IE8完全失败。

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

1 它确实支持:contains(),最后一次在规范的旧CR修订版中定义,之后又删除,以及:not()从该标准扩展。涵盖了jQuery的实现与当前标准之间的差异。

2 在jQuery的早期开发过程中,还将删除其他一些选择器(例如+和和~兄弟组合器:empty:lang()以及一些CSS2属性选择器),只是因为JohnResig认为没有人会使用它们。在进行了更多测试之后,几乎所有人都进入了最终版本。:lang()如上所述,它是唯一一个从未在1.9之前发布任何版本的版本。



 类似资料:
  • 问题内容: 是的,我知道FAQ会假装回答此问题,但实际上并非如此。相反,它指示您从源代码构建项目(并且构建说明非常复杂)。那种打败了整个观点:) 让我们省去世界上每个人的麻烦,即不必再构建另一个开源项目,以了解它是否真正解决了他们的问题。Xuggler支持哪些编解码器? 问题答案: FAQ不能回答这个问题的原因是,随着我们发布新版本,它会不断变化,并且要使文档中的列表保持最新状态会花费很长时间。但

  • 问题内容: 除非不应该这样,但我似乎无法承认类选择器。 我在另一个div内说了4个div,所有的类和id都在上面。我需要选择具有该类的div的第一个实例。例如: 并且显然再次获得相同的效果,但它不会影响任何div。 现在,如果我要强制它与该div一起使用,我可以这样做: 碰巧它是#content中的第3个div,这毫无意义,因为我需要使用该类获取任何东西的第一个实例。 这是HTML的示例,我已经尝

  • 问题内容: 我有一个元素列表,其样式如下: 输出代替 有谁知道如何使用CSS选择除最后一个元素以外的所有元素? 您可以在此处查看选择器的定义 问题答案: 如果不是选择器有问题,则可以设置所有选择器并覆盖最后一个选择器 或者如果您可以使用之前,则不需要最后一个孩子

  • WorkerMan在接口上支持各种协议,只要符合ConnectionInterface接口即可(参见定制通讯协议章节)。 为了方便开发者,WorkerMan提供了HTTP协议、WebSocket协议以及非常简单的Text文本协议、可用于二进制传输的frame协议。开发者可以直接使用这些协议,不必再二次开发。如果这些协议都不满足需要,开发者可以参照定制协议章节实现自己的协议。 开发者也可以直接基于t

  • 本文向大家介绍CSS选择器有哪些?哪些属性可以继承?相关面试题,主要包含被问及CSS选择器有哪些?哪些属性可以继承?时的应答技巧和注意事项,需要的朋友参考一下 选择器 通配符 id class 标签 后代选择器 子选择器 兄弟选择器 属性选择器 伪类选择器 伪元素选择器 可以继承的属性 font-size font-weight font-style font-family color

  • 本文最初发表于博客园,并在GitHub上持续更新前端的系列文章。欢迎在GitHub上关注我,一起入门和进阶前端。 以下是正文。 CSS3介绍 CSS3在CSS2基础上,增强或新增了许多特性, 弥补了CSS2的众多不足之处,使得Web开发变得更为高效和便捷。 CSS3的现状 浏览器支持程度不够好,有些需要添加私有前缀 移动端支持优于PC端 不断改进中 应用相对广泛 应对的策略:渐进增强 (1)坚持渐