【发布时间】:2012-12-02 14:28:38
【问题描述】:
假设我有以下 HTML:
<div class="foo">
<ul>
<li>One</li>
<li>Two</li>
</ul>
</div> <!-- not originally here -->
<div class="bar">
<ul>
<li>Three</li>
<li>Four</li>
</ul>
</div>
我想选择所有li 元素不是 类foo 的元素的后代。我知道我可以用一个花哨的filter function 来做到这一点,但我想知道我是否可以只用一个选择器来做到这一点。首先我尝试了:
$(":not(.foo) li")
不幸的是,这不起作用,因为 li 有 other 没有样式的祖先(在本例中为 ul)。以下似乎有效;
$(":not(.foo) :not(.foo) li")
换句话说,选择所有li 元素,这些元素没有具有类foo 或具有自己的类foo 的祖先。也许这是使用选择器的最佳/唯一方法,但我对 :not 选择器的重复并不感到兴奋。有什么更好的想法吗?
【问题讨论】:
-
这里的问题是
:not(.foo) li并不意味着“li没有具有foo类的祖先”。这意味着“li的祖先没有foo类”。差别看似细微,但实际上差别很大。 -
没错。第二个表示
li,它的祖先没有foo类,并且没有自己的foo祖先。我认为这是正确的结果,但到达那里的方式非常丑陋且令人不满意。