哪个 JQuery 选择器排除了具有匹配给定选择器的父级的项?

是的

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

作为选择所有类为 foobar且不从类为 baz的元素下降的元素的一种方法。有没有一个选择器,将完成同样的事情,而不需要一个过滤 lambda?

<div class='foo'/><!--match this-->
<div class='bar'/><!--match this-->
<div class='baz'>
<div class='foo'/> <!--don't match this-->
</div>
34604 次浏览
$('.foo:not(.baz .foo),.bar:not(.baz .bar)')

在顶级选择器中添加一个: not (’. baz’)。

混乱给出的选择器应该工作:

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

只是想给你一个关于 FireBug的扩展 FireFinder的技巧,你可以用它来测试你的 css/jquery 选择器。

网址: Fifinder 是 Firebug 的一个扩展(在 Firefox 中) ,它提供了快速查找与选择的 CSS 选择器或 XPath 表达式匹配的 HTML 元素的功能。它允许您即时测试页面中的 CSS 选择器,同时查看内容,匹配的元素将被突出显示。

事实上,jQuery 并没有一种特别优雅的方式来完成您想要的任务。虽然“混沌”的答案确实有效,但你不得不怀疑复杂的选择器(它的速度和复杂网页中的选择器一样慢)是否值得你使用更冗长但更快的过滤器功能。这其实没什么大不了的,我只是个人厌倦了特别冗长、令人费解的选择器,尽管我可以避免它。

另一个不同的选择是创建您自己的选择器,因为 jQuery 非常棒:

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


$('.foo,.bar').filter(':parents(.baz)');

expr映射是 Sizzle 选择器引擎的一部分,文档可以在这里找到: Sizzle 自定义伪选择器

我没法让这个起作用:

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

但我能让这个起作用:

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

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

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

我使用的是 Roots 主题,他们将下拉列表从“子菜单”改为“。下拉列表-菜单”

试试这个:

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