2009-06-08 11 views
62

Ich habeWelcher JQuery-Selektor schließt Elemente mit einem übergeordneten Element aus, das einem bestimmten Selektor entspricht?

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

als eine Möglichkeit, alle Elemente, deren Klassen zu wählen sind entweder foo oder bar und wer sie absteigen nicht von einem Element, dessen Klasse ist baz. Gibt es einen Selektor, der dasselbe erreicht, ohne dass ein Filter-Lambda benötigt wird?

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

aus allen Antworten Ich mag die Art und Weise Sie am besten tun. – Dean

+2

können Sie die "nächste" Methode anstelle von "Eltern" verwenden, um es schneller zu machen. 'closed' hört auf zu suchen, sobald ein übereinstimmendes Element gefunden wird, während" elterns "den DOM-Baum zum Wurzelelement des Dokuments bewegt, um übereinstimmende Elemente zu finden. – RayOnAir

Antwort

72

Die Wahrheit der Sache ist, dass jQuery einfach nicht eine besonders elegante Möglichkeit hat, zu tun, was Sie wollen. Während die Antwort des Chaos funktioniert, müssen Sie sich fragen, ob der komplizierte Selektor (der ungefähr so ​​langsam wie ein Selektor in einer komplizierten Webseite sein könnte) sich über die ausführlichere, aber schnellere Filterfunktion, die Sie haben, lohnt. Das ist nicht wirklich so eine große Sache, ich bin nur persönlich von besonders langen, zusammengewürfelten Auswählern müde, wenn ich es vermeiden kann.

Eine andere Möglichkeit ist, Ihre eigenen Wähler zu erstellen, da jQuery ist genial:

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

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

Die expr Karte ist Teil der Sizzle-Selektor-Engine und die Dokumentation finden Sie hier: Sizzle Custom Pseudo-Selectors

+0

akzeptieren, weil es vollständiger ist als Chaos '- wo finde ich die Dokumentation über die API für die Ausdruck Array? –

+0

Es gibt nicht wirklich irgendwelche, soweit ich weiß. –

+0

Diese Antwort löste ein ähnliches Problem für mich. +1 – friedo

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

hinzufügen: ('baz') nicht auf Ihren Top-Level-Selektor.

1

Der Wähler Chaos sollte gibt arbeiten:

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

Nur du FireFinder, die Sie verwenden können, um testen Sie Ihre CSS/jQuery Selektoren eine Spitze über eine Verlängerung FireBug genannt geben wollte.

Von der Website: Firefinder ist eine Erweiterung zu Firebug (in Firefox) und bietet die Funktionalität, auf schnelle Weise HTML-Elemente zu finden, die ausgewählten CSS-Selektoren oder XPath-Ausdruck entsprechen. Sie können Ihre CSS-Selektoren sofort auf der Seite testen, während Sie den Inhalt gleichzeitig sehen, und die übereinstimmenden Elemente werden hervorgehoben.

+0

+1 für die Einführung in FireFinder – Dean

14

I couldn ‚t bekommen dies funktioniert:

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

Aber ich kann diese an die Arbeit:

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

Hinweis: Nicht sicher, ob dies etwas mit der jQuery-Version Ich bin mit 1.2.6

+0

Die Verwendung von '$(). Not()' ist die einfachste Lösung. Und es ist gut [dokumentiert] (http://api.jquery.com/not/), genau das zu tun, was gefragt wurde. – peter

1

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

Ich verwende Roots Thema zu tun hat, und sie ändern, um die Dropdown-Listen von ‚sub- Menü ‚auf‘ .dropdown-Menü‘

2

versuchen diese:

   $('div') 
       .filter(function() { 

        return ($(this).parent().not('.baz')); 
       }) 
Verwandte Themen