选择元素,除非它只使用选择器具有给定类的祖先
假设我有以下HTML:
- One
- Two
我想选择所有不是类foo
的元素后代的li
元素。 我知道我可以使用花哨的过滤function来做到这一点,但我想知道我是否可以只使用选择器来做到这一点。 首先我试过:
$(":not(.foo) li")
不幸的是,这不起作用,因为li
有其他没有风格的祖先(在这种情况下是ul
)。 以下似乎有效;
$(":not(.foo) :not(.foo) li")
换句话说,选择所有没有祖先的li
元素,这些元素具有类foo
或者具有类foo
的祖先。 也许这是使用选择器执行此操作的最佳/唯一方法,但我对于重复:not
选择器并不感到兴奋。 还有更好的想法吗?
小提琴
你可以这样做
$("li").not('.foo li')
要么
$("li:not(.foo li)")
选择所有没有类foo的祖先的li
试试li:not(.foo > ul > li)
; 选择所有lis减去父母.foo两个级别的那些。
您可以使用上下文和选择器一起使用,
$('li', $('div:not(.foo)'))
演示
$('li', $('div:not(.foo)')).each(function(){ alert($(this).text()); });
我认为这个解决方案看起来更好一些,但关于速度差异的API评论存在一些争议。
$("li").not(".foo li")
小提琴