Nie jest selektorem klasy w jQuery

270

Czy istnieje proste wyrażenie selektora, aby nie wybierać elementów o określonej klasie?

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

Chcę tylko zdobyć pierwsze trzy divy i spróbować

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

Ale otrzymuje to wszystko, ponieważ ostatni div zawiera więcej niż pierwszy takt. Czy istnieje sposób użycia symbolu zastępczego w takim wyrażeniu? Coś w tym stylu

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

Jakieś inne selektory, które mogą pomóc?

Zardoz
źródło
Podrap mój wcześniejszy komentarz, po prostu ponownie przeczytam pytanie. Klasa krytyczna to first-bar.
BoltClock
W przypadku, gdy chcemy wybrać wszystkie elementy, które nie mają ani klasy 1, ani klasy 2, konkatenacja działałaby:$('div[class^="first-"]').not('.class1').not('.class2')
J0ANMM

Odpowiedzi:

543

Potrzebujesz :not()selektora:

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

lub alternatywnie .not()metoda:

$('div[class^="first-"]').not('.first-bar');
samotny dzień
źródło
91
Zauważ, że ponieważ: not () jest do 2-3 razy szybszy niż .not () ( jsperf.com/jquery-css3-not-vs-not ), możesz użyć: not (). Jednak dokumenty jQuery zalecają użycie zamiast tego .not (), ponieważ jest bardziej czytelny ( api.jquery.com/not-selector ). Mam nadzieję, że to pomoże komuś podjąć decyzję między nimi!
rinogo
2
@rinogo Teraz jest szybsze, że zdecydowana większość przeglądarek obsługuje querySelectorAll, ale nie zawsze tak było.
lonesomeday
4
Tak, dokładnie! :) Mam nadzieję, że mój komentarz nie był krytyką; Raczej chciałbym dodać do twojego już pomocnego pytania.
rinogo
1
Dzięki!! wyłącz klawisz Enter na wszystkich polach oprócz moich filtrów. $ ("input: not (.rgFilterBox)"). keydown (function (e) {if (e.keyCode == 13) {return false;} return true;});
hardba11,
3
@Daniel, tak, ale jeśli jest , to jest to bardzo łatwo zmienić, aby uzyskać natychmiastowy wzrost wydajności :)
rinogo
85

Możesz użyć :notselektora filtrów:

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

Lub not()metoda:

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

Więcej informacji:

Sarfraz
źródło
3
"Powinny zostać pominięte, jeśli go używać jako selektor CSS.
BoltClock
17
@BoltClock: Jest potrzebny dla wartości ze spacjami w nich, postanowiłem, że zawsze określam te wartości :)
Sarfraz