2011-12-14 30 views
17

Por ejemplo, decir que tengo el siguiente:jQuery: ¿Es posible seleccionar elementos con una sola clase entre elementos con, potencialmente, hasta 3 clases?

<span class="a b c">Has class a, b, and c</span> 
<span class="a">Has class a</span> 
<span class="b c">Has class b and c</span> 
<span class="a c">Has class a and c</span> 
<span class="a c">Has class a and c</span> 
<span class="a">Has class a</span> 

Ahora, supongamos que quiero seleccionar todos los elementos que tienen única clase a.
Lo que significa que solo se seleccionarán el segundo y el último span s.
¿Hay una manera simple de hacer esto?

Respuesta

4

supongo que si quería hacer esto simplemente podría hacer:

var spans = $("span[class='a']"); 
+3

breve nota al OP: usted no tiene que incluir la palabra 'span' en el selector como Phil tiene aquí. Si hay divs o imgs que pueden tener la clase deseada y desea seleccionarlos, '$ (" [class = 'a'] ")' lo hará. – maxedison

+1

El problema con esto es si el atributo contiene espacios en blanco, se romperá.Los selectores de clase no tienen ese problema. –

32
$('.a').not('.b, .c') 

Esto seleccionará todos los elementos con la clase a que no tienen b o c. Sin embargo, aún podrían tener la clase d, e, etc. Use la respuesta de Phil si realmente solo desea elementos sin clase que no sea a.

+0

Upvoting porque probablemente es preferible permitir clases no relacionadas en muchos casos, y el código resultante es más limpio. Si bien esto es menos "a prueba de futuro", es probable que en realidad no desee el tipo de prueba a futuro que da mi respuesta (que coincide con la pregunta exacta en el PO). –

9

(Véase más abajo para qué es posible que no quieren hacer exactamente lo que se pide en la pregunta)

podría utilizar el [class="a"] "atributo es igual selector", aunque es frágil:

$('span[class="a"]').hide(); 

El problema es que si tiene un espacio en blanco en su atributo de clase, se romperá. Ver este violín: http://jsfiddle.net/c7DP7/

Puedes solucionar este problema haciendo una consulta básica en esos elementos mediante un selector de clase normal, entonces filtrar aún más mientras chequeando solo a se establece (y el recorte de los espacios en blanco en ese segundo filtro). Ver este violín: http://jsfiddle.net/uD48E/1/

$('.a') 
    .filter(function(index){ 
     return $(this).attr("class").trim() == "a"; 
    }) 
    .hide(); 

La pregunta parece que está tratando de hacer más código "prueba de futuro", pero que el enfoque específico es más frágil. Rechazar todas las clases que no están relacionadas con la clase actual para la que está filtrando puede romper cosas por razones no relacionadas con la clase a (como una clase no relacionada d o e que se agrega más adelante). Esto es importante si el HTML al que está aplicando su jQuery podría cambiarse en el futuro.

Una mejor forma de hacerlo es filtrar solo las clases que afectan el significado de la clase a. Permitir ese tipo de flexibilidad es lo que realmente hace que su código sea más a prueba de futuro. Consulte maxedison's answer para conocer la mejor manera de hacerlo.

1

Otro método es eliminar esas clases y luego verificar si queda alguna clase. Si no, ejecute la función:

JS Fiddle

$('.a').each(function() { 
    var $this = $(this); 
    if (!$this.removeClass('a').attr('class').length) { 
     //Execute function here 
    } 
}); 
Cuestiones relacionadas