Pas de sélecteur de classe dans jQuery

272

Existe-t-il une expression de sélection simple pour ne pas sélectionner des éléments avec une classe spécifique?

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

Je veux juste obtenir les trois premiers divs et essayé

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

Mais cela reçoit tout car le dernier div contient plus que la première mesure. Existe-t-il un moyen d'utiliser un espace réservé dans une telle expression? Quelque chose comme ca

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

D'autres sélecteurs peuvent-ils vous aider?

Zardoz
la source
Grattez mon commentaire précédent, je viens de relire la question. La classe critique est first-bar.
BoltClock
Dans le cas où l'on veut sélectionner tous les éléments qui n'ont ni classe1 ni classe2, la concaténation fonctionnerait:$('div[class^="first-"]').not('.class1').not('.class2')
J0ANMM

Réponses:

545

Vous avez besoin du :not()sélecteur:

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

ou, alternativement, la .not()méthode:

$('div[class^="first-"]').not('.first-bar');
solitaire
la source
91
Notez que puisque: not () est jusqu'à 2-3 fois plus rapide que .not () ( jsperf.com/jquery-css3-not-vs-not ), vous pouvez utiliser: not (). Cependant, les documents jQuery recommandent d'utiliser .not () à la place, car il est plus lisible ( api.jquery.com/not-selector ). J'espère que cela aide quelqu'un à prendre une décision entre les deux!
rinogo
2
@rinogo Il est plus rapide maintenant que la grande majorité des navigateurs prennent en charge querySelectorAll, mais cela n'a pas toujours été le cas.
lonesomeday
4
Oui, exactement! :) J'espère que mon commentaire n'est pas apparu comme une critique; Je voulais plutôt ajouter à votre question déjà utile.
rinogo
1
Merci!! désactiver la touche entrée sur tous, sauf mes boîtes de filtrage. $ ("input: not (.rgFilterBox)"). keydown (function (e) {if (e.keyCode == 13) {return false;} return true;});
hardba11
3
@ Daniel, oui, mais si elle est , alors il est un super changement facile d'obtenir un gain de performance instantanée :)
rinogo
85

Vous pouvez utiliser le :notsélecteur de filtre:

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

Ou not()méthode:

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

Plus d'informations:

Sarfraz
la source
3
Le "doit être omis si vous l'utilisez comme sélecteur CSS.
BoltClock
17
@BoltClock: Il est nécessaire pour les valeurs contenant des espaces, j'ai pris l'habitude de les spécifier toujours :)
Sarfraz