哪种JQuery选择器排除其父项与给定选择器匹配的项目?


72

我有

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>

2
您可以使用该closest方法而不是parents使其更快。closest一旦找到匹配的元素,它就会停止寻找,而parents在DOM树中向上移动到文档的根元素以找到匹配的元素。
RayOnAir

Answers:


79

事实的真相是,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自定义伪选择器


接受,因为它比混乱更完整-在哪里可以找到关于expr数组的API上的文档?
丹·戴维斯·布拉基特

据我所知,实际上没有任何东西。
Paolo Bergantino,2009年

10
尽管我认为我可以将表达式名称更改为“ noparents”,但这很整洁,因为这描述了它的作用。
马特·萨赫

指向该JSBin的链接与答案不匹配。已经有一段时间了,因此该URL必须已被回收。
gfullam

expr为此答案添加了对文档的引用。
matpie


18

我无法使它工作:

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

但是我可以使它工作:

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

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


使用$().not()是最简单的解决方案。并有充分的文档证明它可以执行所要求的操作。
彼得,2013年


1

选择器混乱给应该工作:

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

只是想给您一些有关FireBug扩展的提示,名为FireFinder,您可以使用它来测试CSS / jQuery选择器。

在网站上:Firefinder是Firebug(在Firefox中)的扩展,并提供了快速找到与所选CSS选择器或XPath表达式匹配的HTML元素的功能。它使您可以在查看页面的同时立即在页面中测试CSS选择器,同时突出显示匹配的元素。


1

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

我正在使用Roots主题,它们将下拉菜单从“子菜单”更改为“ .dropdown-菜单”


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.