2011-09-15 17 views
11

Esta es la estructura de la instrucción if-else que estoy utilizando:Cómo escribir una declaración de interruptor en jQuery/Javascript para probar si un elemento tiene una clase en particular?

$('.myclass a').click(function() { 
    if ($(this).hasClass('class1')) { 
     //do something 
    } else if ($(this).hasClass('class2')) { 
     //do something 
    } else if ($(this).hasClass('class3')) { 
     //do something 
    } else if ($(this).hasClass('class4')) { 
     //do something 
    } else { 
     //do something 
    } 
}); 

hay un buen número de casos ya y pensé utilizando una sentencia switch sería más ordenado. ¿Cómo lo hago en jQuery/javascript?

+1

Qué '.myclass a' sólo tienen una sola clase? – sberry

+0

¿Por qué no unir el controlador de evento click directamente a los enlaces con la clase correspondiente? –

+0

@ sberry2A - Tiene solo 1 clase. – catandmouse

Respuesta

19

El problema es que un usuario puede tener más de una clase. De lo contrario se podría hacer:

$('.myclass a').click(function() { 
    var className = $(this).attr('class'); 
    switch(className){ 
     case 'class1': 
    //put your cases here 
    } 
}); 
+0

Esto funcionó para mí ya que solo tiene 1 clase. Gracias. – catandmouse

+2

No es una buena idea usar una variable llamada 'clase' ya que creo que es una palabra reservada en Javascript (reservada para uso futuro). Cámbielo a 'className' o algo además de' class'. – jfriend00

+0

Lo hizo, gracias por la sugerencia –

17

Pruebe esto. No es mucho más limpio, pero sigue siendo una declaración de cambio.

$('.myclass a').click(function() { 
    switch (true) { 
     case $(this).hasClass('class1'): 
     // do stuff 
     break; 
     case $(this).hasClass('class2'): 
     // do stuff 
     break; 
     case $(this).hasClass('class3'): 
     // do stuff 
     break; 
    } 
} 
+1

+1 por creatividad, pero aún así es un poco inútil. – Tesserex

+0

@Tesserex: Sí, no es el mejor. Me gusta Nicola es mucho mejor. –

+0

Esto funciona para mí ... Estaba pensando lo mismo también ... Gracias – Zohaib

0

no creo que una sola instrucción switch ayudará aquí, porque un elemento puede tener varias clases, y no se puede utilizar para cambiar elem.className. Una opción es estructurar el código de una manera más fácil de leer, para el uso de un comunicado en el que tener interruptores ...:

$('.myclass a').click(function() 
{ 
    var classes = ["class1", "class2", "class3","class4"]; 
    var self = $(this); 
    for(var i =0, ii = classes.length;i<ii;i++) 
    { 
     var className = classes[i]; 
     if(self.hasClass(className)) 
     { 
      switch(className) 
      { 
       case 'class1': 
        //code here... 
       break; 
       case 'class2': 
        //code here... 
       break;  
       case 'class3': 
        //code here... 
       break;  
       case 'class4': 
        //code here... 
       break; 
      } 

     } 
    }  
}); 
5

creo que la manera más limpia podría ser la siguiente:

$('.myclass a.class1').click(function() { 
    // code to process class1 
}); 

$('.myclass a.class2').click(function() { 
    // code to process class2 
}); 

$('.myclass a.class3').click(function() { 
    // code to process class3 
}); 

$('.myclass a.class4').click(function() { 
    // code to process class4 
}); 

Si usted tuvo un trillón de ellos, incluso se podría ponerlos en una estructura de datos de la siguiente manera:

// to define them all 
var classHandlers = { 
    class1: function() { 
     // class1 code here 
    }, 
    class2: function() { 
     // class2 code here 
    }, 
    class3: function() { 
     // class3 code here 
    }, 
    class4: function() { 
     // class4 code here 
    } 
}; 

// to register them all 
$.each(classHandlers, function(key, fn) { 
    $('.myclass a.' + key).click(fn); 
}); 

Desde lo solicitado (en un comentario) cómo lo haría un controlador de eventos para los objetos sin clase nombre, así es como tú podría hacer eso si se busca ningún nombre de clase:

$(".myclass a").not("[class]").click(function() { 
    // code to handle objects with no class name here 
}); 

he comprobado aquí: http://jsfiddle.net/jfriend00/TAjKR/

+0

Intenté este y esto también funciona (se ve más limpio). Sin embargo, ¿qué ocurre si quiero hacer algo en un '.myclass a' que no tiene clase (en la declaración de cambio, es el valor predeterminado)? ¿Dónde puedo adjuntar el controlador de eventos? – catandmouse

+1

Agregué a mi respuesta una forma de implementar el caso predeterminado de ningún nombre de clase. – jfriend00

+0

Gracias. Trabajó. – catandmouse

0

Para comprobar hasClass en una sentencia switch:

var elementClass; 
var classCheck = $('#myElement').hasClass(elementClass) 

switch(classCheck){ 
    case elementClass === 'foo': 
    console.log('whatever'); 
    break; 
} 
+0

Por favor, edite con más información. Se desalientan las respuestas de solo código y "prueba esto", ya que no contienen contenido que se pueda buscar y no explican por qué alguien debe "probar esto". Hacemos un esfuerzo aquí para ser un recurso para el conocimiento. – abarisone

0

Sé que es tarde y su usuario solo tiene una clase, pero si hubiera más de una clase:

//<div class="foo bar"></div> 
//<div class="other bar"></div> 

switch(true) { 
    case 'foo': 
    true; 
    break; 
    case 'other': 
    true; 
} 
0

$("#isTest").click(function() { 
 

 
\t if($('div').is('.redColor')){ 
 
\t \t $('div').addClass('blueColor'); 
 
\t } 
 

 
    }); 
 

 
    $("#hasClassTest").click(function() { 
 

 
\t if($('div').hasClass('.redColor')){ 
 
\t \t $('div').addClass('blueColor'); 
 
\t } 
 

 
    }); 
 

 
\t $("#reset").click(function() { 
 
\t location.reload(); 
 
    });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<html> 
 
<head> 
 
<style type="text/css"> 
 
    .redColor { 
 
    \t background:red; 
 
    } 
 
    .blueColor { 
 
    \t background:blue; 
 
    } 
 
</style> 
 
<script type="text/javascript" src="jquery-1.3.2.min.js"></script> 
 
</head> 
 
<body> 
 
    <h1>jQuery check if an element has a certain class</h1> 
 

 
    <div class="redColor">This is a div tag with class name of "redColor"</div> 
 

 
    <p> 
 
    <button id="isTest">is('.redColor')</button> 
 
    <button id="hasClassTest">hasClass('.redColor')</button> 
 
    <button id="reset">reset</button> 
 
    </p> 
 

 
</body> 
 
</html>

Cuestiones relacionadas