2011-01-06 18 views
191

¿Hay una expresión de selector simple para no seleccionar elementos con una clase específica?No selector de clase en jQuery

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

sólo quiero conseguir los primeros tres divs y trataron

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

Pero esto recibe todos como el último div contiene más de primer bar. ¿Hay alguna forma de usar un marcador de posición en dicha expresión? Algo así

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

Cualquier otro selector que pueda ayudar?

+0

Scratch my comentario anterior, me acabo de releer la pregunta. La clase crítica es 'first-bar'. – BoltClock

+0

En caso de que uno quiera seleccionar todos los elementos que no tienen ni clase1 ni clase2, la concatenación funcionaría: '$ ('div [clase^=" primero - "]'). No ('. Clase1'). No (' .class2 ') ' – J0ANMM

Respuesta

391

Se necesita el :not() selector:

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

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

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

Tenga en cuenta que dado que: not() es hasta 2-3 veces más rápido que .not() (http://jsperf.com/jquery-css3-not-vs-not), es posible que desee uso: no(). Sin embargo, los documentos de jQuery recomiendan usar .not() en su lugar, ya que es más legible (http://api.jquery.com/not-selector/). Espero que esto ayude a alguien a tomar una decisión entre los dos. – rinogo

+1

@rinogo Ahora es más rápido que la gran mayoría de los navegadores son compatibles con querySelectorAll, pero ese no siempre ha sido el caso. – lonesomeday

+3

¡Sip, exactamente! :) Espero que mi comentario no parezca una crítica; Prefiero agregar a tu pregunta útil. – rinogo