querySelectorAll的选择器无效:不带后代

时间:2015-01-27 09:43:24

标签: javascript css-selectors selectors-api

我有一个案例需要在页面上选择不同的节点组,我需要排除某些子元素。我最常见的任务是选择所有<img>元素,但不选择某些元素的后代。

以我的小提琴为例:http://jsfiddle.net/rjdbys13/ 我有2个<div>个,里面有<img>个。我想选择所有图像,但不能选择其中一个<div> s(都有不同的类)。

为了做到这一点,这适用于jQuery和Sizzlejs,我可以使用像img:not(.amazingDiv img)这样的选择器。据我所知,这将选择所有<img>元素,这些元素不是<div> s的后代,其中包含amazingDiv的类。正如我所说的支持更详细:not语法的库一样,这很有效,但它在querySelectorAll中失败了:

Uncaught SyntaxError: Failed to execute 'querySelectorAll' on 'Document': 'img:not(.amazingDiv img)' is not a valid selector.

我真的很想避免做任何&#34;后处理&#34;关于我收集的元素,有没有办法通过querySelectorAll来实现我所寻找的东西? (我也尝试使用库"qwery",&#34;微选择器&#34;和&#34;坚果&#34;)

修改:由于我搜索选择器组合以支持某些复杂的:not功能无效,我选择使用第三方选择器引擎 - 捷豹(github。 COM / alpha123 /捷豹)。它不是主意,而且速度较慢,但​​最终结果可能更有效,因为我不需要&#34;发布流程&#34;我的结果。

3 个答案:

答案 0 :(得分:5)

您使用的选择器根据规格不正确:

  

选择器级别3不允许在:not()伪类中使用单个simple selector以外的任何内容。

     

The negation pseudo-class, :not(X),是一个功能符号   简单的选择器(不包括否定伪类本身)作为   论点。它表示一个未由其表示的元素   参数。

答案 1 :(得分:0)

不幸的是,目前您无法使用标准CSS选择器进行操作。目前,:not() only accepts a single simple selector at a time,因此其使用非常有限。

在即将推出的标准:not() will be upgraded to allow combinators and complex selectors中,使其功能与选择器库提供的​​功能相同。这意味着,一旦浏览器开始实施增强功能,最终您使用的内容将成为有效的选择器。

但与此同时,假设您无法使用不使用:not()的其他选择器选择所需的元素,那么您将无法做到这没有选择所有img元素并单独排除.amazingDiv img(表示&#34;后处理&#34;对这些元素)。

答案 2 :(得分:0)

如果忽略div本身,那么下面的所有图像都会自动被丢弃。

document.querySelectorAll("#parent div:not(.amazingDiv2) img")