Não é um seletor de classe no jQuery

271

Existe uma expressão seletora simples para não selecionar elementos com uma classe específica?

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

Eu só quero pegar os três primeiros divs e tentei

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

Mas isso recebe tudo, pois a última div contém mais que a primeira barra. Existe uma maneira de usar um espaço reservado nessa expressão? Algo parecido

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

Algum outro seletor que possa ajudar?

Zardoz
fonte
Risque meu comentário anterior, apenas reli a pergunta. Classe crítica é first-bar.
BoltClock
Caso alguém deseje selecionar todos os elementos que não possuem classe1 ou classe2, a concatenação funcionaria:$('div[class^="first-"]').not('.class1').not('.class2')
J0ANMM

Respostas:

544

Você precisa do :not()seletor:

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

ou, alternativamente, o .not()método:

$('div[class^="first-"]').not('.first-bar');
lonesomeday
fonte
91
Observe que, como: not () é até 2-3 vezes mais rápido que .not () ( jsperf.com/jquery-css3-not-vs-not ), convém usar: not (). No entanto, os documentos do jQuery recomendam o uso de .not (), pois é mais legível ( api.jquery.com/not-selector ). Espero que isso ajude alguém a tomar uma decisão entre os dois!
Rinogo 22/07
2
@rinogo É mais rápido agora que a grande maioria dos navegadores suporta querySelectorAll, mas esse nem sempre foi o caso.
Loneomeday
4
Sim, exatamente! :) Espero que meu comentário não tenha aparecido como crítica; Eu pretendia acrescentar à sua pergunta já útil.
Rinogo 23/07
1
Obrigado!! desativar a tecla enter em todas as caixas de filtragem, exceto minhas. $ ("input: not (.rgFilterBox)"). keydown (função (e) {if (e.keyCode == 13) {return false;} return true;});
hardba11
3
@ Daniel, sim, mas se ele é , então é uma mudança fácil super para obter um aumento de desempenho instantâneo :)
rinogo
85

Você pode usar o :notseletor de filtro:

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

Ou not()método:

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

Mais informações:

Sarfraz
fonte
3
O "deve ser omitido se a usá-lo como um seletor CSS.
BoltClock
17
@BoltClock: É necessário para valores com espaços entre eles, eu tornaram um hábito meu para especificar os sempre :)
Sarfraz