什么JQueryselect器排除项与父母匹配给定的select器?

我有

var $set = $('.foo,.bar').filter( function() {return $(this).parents('.baz').length < 1;}); 

作为一种select所有类的元素是foo或者bar而不是从类baz的元素下降的元素的方法。 是否有一个select器可以完成同样的事情,而不需要过滤lambda?

 <div class='foo'/><!--match this--> <div class='bar'/><!--match this--> <div class='baz'> <div class='foo'/> <!--don't match this--> </div> 

事实的真相是,jQuery根本没有一个特别优雅的方式来做你想做的事情。 尽pipe混沌的答案确实起作用,但你不得不怀疑,复杂的select器(与select器相比,速度可能会变得复杂的网页)是否值得胜过更冗长但更快速的filterfunction。 这并不是什么大不了的事情,我只是为了避免这个问题而对特别冗长,烦人的select器感到厌倦。

另一个select是创build你自己的select器,因为jQuery非常棒:

 jQuery.expr[':'].parents = function(a,i,m){ return jQuery(a).parents(m[3]).length < 1; }; $('.foo,.bar').filter(':parents(.baz)'); 

expr映射是Sizzleselect器引擎的一部分,文档可以在这里find: Sizzle Custom Pseudo-Selectors

 $('.foo:not(.baz .foo),.bar:not(.baz .bar)') 

我无法得到这个工作:

 $(".children:not(#parent .children)"); 

但我可以得到这个工作:

 $(".children").not($("#parent .children")); 

注意:不知道这是否与我使用的jQuery版本1.2.6有关

试试这个:

  $('div') .filter(function () { return ($(this).parent().not('.baz')); }) 

select混乱给出应该工作:

 $('.foo:not(.baz .foo),.bar:not(.baz .bar)') 

只是想给你一个关于FireBug扩展的小贴士 ,叫做FireFinder ,你可以用它来testing你的css / jqueryselect器。

从网站: Firefinder是Firebug(在Firefox中)的扩展,提供了快速查找匹配所选CSSselect器或XPathexpression式的HTML元素的function。 它允许您在查看内容的同时立即testing页面中的CSSselect器,并且匹配的元素将被突出显示。

var $li = jQuery('li', this).not('.dropdown-menu > li');

我正在使用Roots主题,并将“子菜单”的下拉列表更改为“.dropdown-menu”

添加:不('。baz')到您的顶级select器。