选择元素,除非它只使用选择器具有给定类的祖先

假设我有以下HTML:

  • One
  • Two
  • Three
  • Four

我想选择所有不是foo的元素后代的li元素。 我知道我可以使用花哨的过滤function来做到这一点,但我想知道我是否可以只使用选择器来做到这一点。 首先我试过:

 $(":not(.foo) li") 

不幸的是,这不起作用,因为li其他没有风格的祖先(在这种情况下是ul )。 以下似乎有效;

 $(":not(.foo) :not(.foo) li") 

换句话说,选择所有没有祖先的li元素,这些元素具有类foo或者具有类foo的祖先。 也许这是使用选择器执行此操作的最佳/唯一方法,但我对于重复:not选择器并不感到兴奋。 还有更好的想法吗?

小提琴

你可以这样做

 $("li").not('.foo li') 

http://jsfiddle.net/y7s54/

要么

 $("li:not(.foo li)") 

http://jsfiddle.net/QpCYY/

选择所有没有类foo的祖先的li

试试li:not(.foo > ul > li) ; 选择所有lis减去父母.foo两个级别的那些。

您可以使用上下文和选择器一起使用,

 $('li', $('div:not(.foo)')) 

演示

 $('li', $('div:not(.foo)')).each(function(){ alert($(this).text()); });​ 

这个怎么样:

 $("li:not(.foo > li)") 

如果这不起作用,文档中的注释非常有用:

http://api.jquery.com/not-selector/

我认为这个解决方案看起来更好一些,但关于速度差异的API评论存在一些争议。

 $("li").not(".foo li") 

小提琴