栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么我的jQuery:not()选择器在CSS中不起作用?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么我的jQuery:not()选择器在CSS中不起作用?

为什么

:not()
选择器在jQuery中起作用但在CSS中失败?自从jQuery声称自己是“符合CSS3的”以来,它在两个地方都不能完全一样工作吗?还是我缺少某些东西?

也许 应该 ,但是事实 并非如此 :jQuery扩展了

:not()
选择器,以便[您可以将 _任何选择器_传递给它,无论它有多复杂,_我都怀疑_主要原因是与[
.not()
方法,该方法还可以使用任意复杂的选择器并进行相应的过滤。它确实保持了类似CSS的语法,但是它是从标准中定义的内容扩展而来的。

另一个例子,这很好用(我知道与问题给出的例子相比,这是一个非常荒谬的例子,但这只是出于说明目的):

$('section:not(body > [class], body > :has([class]))')

请记住,将以逗号分隔的选择器列表传递给

:not()
意味着过滤 与所有列出的选择器都不匹配的 元素。

另一方面,现在

:not()
选择器级别3中的伪类受其自身的限制。您只能将
一个简单的选择器 作为参数传递给
:not()
。这意味着您一次只能通过以下任何一项:

  • 通用选择器(
    *
    ),可以选择使用名称空间
  • 型选择器(
    a
    div
    span
    ul
    li
    ,等),任选地与一个命名空间
  • 属性选择器(
    [att]
    [att=val]
    等),可以选择使用名称空间
  • 类选择器(
    .class
  • ID选择器(
    #id
  • 伪类(
    :pseudo-class

因此,这是jQuery的

:not()
选择器和当前标准的
:not()
选择器之间的区别:

  1. 首先,要直接回答这个问题: 您不能传递以逗号分隔的选择器列表。 1例如,如小提琴所示,虽然给定的选择器可在jQuery中使用,但它不是有效的CSS:

    sectors > div:not(.alpha, .beta, .gamma)

是否有一个纯CSS解决方法,还是我必须依靠脚本?

幸运的是,在这种情况下,它已经存在。您只需要将多个

:not()
选择器一个接一个地链接,以使其成为有效的CSS:

    #sectors > div:not(.alpha):not(.beta):not(.gamma)

它不会使选择 的是 更长的时间,但矛盾和不便依然明显。

  1. 您不能将简单的选择器组合到复合选择器中以与一起使用
    :not()
    这在jQuery中有效,但无效的CSS:

    foo > div:not(.foo.bar.baz)

您需要将其拆分为多个取反(不仅仅是链接它们!)以使其有效成为CSS:

    #foo > div:not(.foo), #foo > div:not(.bar), #foo > div:not(.baz)

如您所见,这比第1点更为不便。

  1. 您不能使用组合器。 这适用于jQuery,但不适用于CSS:
    /*
    • Grab everything that is neither #foo itself nor within #foo.
    • Notice the descendant combinator (the space) between #foo and .

      /
      :not(#foo, #foo *)

这是一个特别令人讨厌的情况,主要是因为它没有适当的解决方法。有一些 _宽松的_解决方法1和2,但是它们几乎总是取决于HTML结构,因此实用性非常有限。

  1. 在实现
    querySelectorAll()
    :not()
    选择器的浏览器中,以
    :not()
    使其成为有效CSS选择器的方式在选择器字符串中使用将导致方法直接返回结果,而不是退回到Sizzle(实现
    :not()
    扩展的jQuery选择器引擎)。如果您是表现的坚持者,那么这肯定是一笔微不足道的奖金,您一定会垂涎三尺。

好消息是选择器4增强了

:not()
选择器,以允许使用逗号分隔复杂选择器列表。复杂选择器仅仅是一个简单的简单选择器或复合选择器,或者是由组合器分隔开的整个复合选择器链。简而言之,您在上方看到的所有内容。

这意味着上面的jQuery示例将成为有效的4级选择器,这将使伪类在未来几年内CSS实现开始支持伪类时变得更加有用。


1 尽管本文说您可以

:not()
在Firefox3中将以逗号分隔的选择器列表传递到,但您不应该能够这样做。如果该文章声称该版本可在Firefox3中运行,那是因为Firefox3中的一个错误我无法再找到该错误的票证,但直到将来的浏览器实现将来的标准时,它才起作用。看到该文章迄今被引用的频率,我已经对此效果发表了评论,但是还看到了该文章的年代以及该网站的更新频率如何,我真的没有指望作者再来修复它。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/408054.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号