Keine Klassenauswahl in jQuery

270

Gibt es einen einfachen Selektorausdruck, um Elemente mit einer bestimmten Klasse nicht auszuwählen?

<div class="first-foo" />
<div class="first-moo" />
<div class="first-koo" />
<div class="first-bar second-foo" />

Ich möchte nur die ersten drei Divs bekommen und es versucht haben

$(div[class^="first-"][class!="first-bar"])

Dies erhält jedoch alles, da das letzte Div mehr als den ersten Takt enthält. Gibt es eine Möglichkeit, einen Platzhalter in einem solchen Ausdruck zu verwenden? Sowas in der Art

$(div[class^="first-"][class!="first-bar*"]) // doesn't seem to work

Gibt es noch andere Selektoren, die helfen könnten?

Zardoz
quelle
Scratch meinen früheren Kommentar, ich habe gerade die Frage noch einmal gelesen. Kritische Klasse ist first-bar.
BoltClock
Wenn man alle Elemente auswählen möchte, die weder Klasse1 noch Klasse2 haben, würde die Verkettung funktionieren:$('div[class^="first-"]').not('.class1').not('.class2')
J0ANMM

Antworten:

543

Sie benötigen den :not()Selektor:

$('div[class^="first-"]:not(.first-bar)')

oder alternativ die .not()Methode:

$('div[class^="first-"]').not('.first-bar');
einsamer Tag
quelle
91
Da: not () bis zu 2-3 Mal schneller als .not () ( jsperf.com/jquery-css3-not-vs-not ) ist, möchten Sie möglicherweise Folgendes verwenden: not (). In den jQuery-Dokumenten wird jedoch empfohlen, stattdessen .not () zu verwenden, da es besser lesbar ist ( api.jquery.com/not-selector ). Hoffe das hilft jemandem eine Entscheidung zwischen den beiden zu treffen!
Rinogo
2
@rinogo Es ist jetzt schneller, dass die überwiegende Mehrheit der Browser querySelectorAll unterstützt, aber das war nicht immer der Fall.
einsamer
4
Ja genau! :) Ich hoffe, mein Kommentar wurde nicht kritisiert. Ich wollte eher Ihre bereits hilfreiche Frage ergänzen.
Rinogo
1
Vielen Dank!! Deaktivieren Sie die Eingabetaste für alle außer meinen Filterboxen. $ ("input: not (.rgFilterBox)"). keydown (Funktion (e) {if (e.keyCode == 13) {return false;} return true;});
Hardba11
3
@ Daniel, ja, aber wenn es ist , dann ist es eine super einfache Änderung, um einen sofortigen Leistungsschub zu bekommen :)
Rinogo
85

Sie können die :notFilterauswahl verwenden:

$('foo:not(".someClass")')

Oder not()Methode:

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

Mehr Info:

Sarfraz
quelle
3
Das "sollte weggelassen werden, wenn es als CSS-Selektor verwendet wird.
BoltClock
17
@ BoltClock: Es wird für Werte mit Leerzeichen benötigt, ich habe es mir zur Gewohnheit gemacht, diese immer anzugeben :)
Sarfraz