No selector de clase en jQuery

271

¿Existe una expresión de selector simple para no seleccionar elementos con una clase específica?

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

Solo quiero obtener los primeros tres divs e intenté

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

Pero esto recibe todo ya que el último div contiene más que la primera barra. ¿Hay alguna manera de usar un marcador de posición en tal expresión? Algo como eso

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

¿Algún otro selector que pueda ayudar?

Zardoz
fuente
Rasca mi comentario anterior, acabo de releer la pregunta. La clase crítica es first-bar.
BoltClock
En caso de que uno quiera seleccionar todos los elementos que no tienen clase 1 o clase 2, la concatenación funcionaría:$('div[class^="first-"]').not('.class1').not('.class2')
J0ANMM

Respuestas:

544

Necesitas el :not()selector:

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

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

$('div[class^="first-"]').not('.first-bar');
solitario
fuente
9191
Tenga en cuenta que dado que: not () es hasta 2-3 veces más rápido que .not () ( jsperf.com/jquery-css3-not-vs-not ), es posible que desee usar: not (). Sin embargo, los documentos de jQuery recomiendan usar .not () en su lugar, ya que es más legible ( api.jquery.com/not-selector ). ¡Espero que esto ayude a alguien a tomar una decisión entre los dos!
rinogo
2
@rinogo Ahora es más rápido que la gran mayoría de los navegadores admiten querySelectorAll, pero ese no siempre ha sido el caso.
solitario el
44
Sí, exactamente! :) Espero que mi comentario no parezca una crítica; Prefiero agregar a su ya útil pregunta.
rinogo
1
¡¡Gracias!! deshabilite la tecla Intro en todos menos mis cuadros de filtrado. $ ("input: not (.rgFilterBox)"). keydown (function (e) {if (e.keyCode == 13) {return false;} return true;});
hardba11
3
@Daniel, sí, pero si es así , entonces es un cambio súper fácil obtener un aumento instantáneo del rendimiento :)
rinogo
85

Puede usar el :notselector de filtro:

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

O not() método:

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

Más información:

Sarfraz
fuente
3
Se "debe omitir si se usa como un selector CSS.
BoltClock
17
@BoltClock: es necesario para los valores con espacios en ellos, he hecho un hábito mío especificarlos siempre :)
Sarfraz