我有一个案例需要在页面上选择不同的节点组,我需要排除某些子元素。我最常见的任务是选择所有<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;我的结果。
答案 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")