La forma más fácil de alternar 2 clases en jQuery

218

Si tengo la clase .A y la clase .B y quiero cambiar entre hacer clic en el botón, ¿cuál es una buena solución para eso en jQuery? Todavía no entiendo cómo toggleClass()funciona.

¿Existe una solución en línea para ponerlo en onclick=""evento?

Stewie Griffin
fuente
55
Inline JS ( onclick="") es malo. ¿Por qué no utiliza jQuery para registrar un controlador de eventos adecuado (o un delegado / evento en vivo si tiene muchos elementos con el mismo controlador)
ThiefMaster

Respuestas:

511

Si su elemento expone la clase Adesde el principio, puede escribir:

$(element).toggleClass("A B");

Esto eliminará la clase Ay agregará clase B. Si vuelve a hacer eso, eliminará la clase By restablecerá la clase A.

Si desea hacer coincidir los elementos que exponen cualquiera de las clases, puede usar un selector de clase múltiple y escribir:

$(".A, .B").toggleClass("A B");
Frédéric Hamidi
fuente
3
¿Qué pasa si en lugar del elemento quiero poner la clase A o B dependiendo del estado?
Stewie Griffin
1
Tenga en cuenta que debe almacenar en caché el objeto que intenta alternar en lugar de seleccionar los elementos cada vez, el uso más común para alternar clases es en un controlador de clic. var $trigger = $(".A"); $trigger.on("click", function() {$trigger.toggleClass("A B")});
mummybot
1
@mummybot: marcado como condescendiente. Frédéric: ¿y si el elemento no tiene ninguna clase "desde el principio"? ese es un estado importante también.
vsync
3
Esto ya no funciona. Ahora agrega y elimina ambas clases al mismo tiempo.
Fabián
1
@ FrédéricHamidi No sé qué hice mal, pero no funcionó cuando lo intenté. Ahora parece estar bien. En mi caso, agregó y eliminó ambas clases al mismo tiempo, pero parece funcionar ahora. Probablemente estropeé algo más y afectó esta función. Eliminé mi comentario. Perdón por la confusion.
BurakUeda
40

Aquí hay una versión simplificada: ( aunque no elegante, pero fácil de seguir )

$("#yourButton").toggle(function() 
{
        $('#target').removeClass("a").addClass("b"); //Adds 'a', removes 'b'

}, function() {
        $('#target').removeClass("b").addClass("a"); //Adds 'b', removes 'a'

});

Alternativamente, una solución similar:

$('#yourbutton').click(function()
{
     $('#target').toggleClass('a b'); //Adds 'a', removes 'b' and vice versa
});
Rion Williams
fuente
3
Creo que esta forma de uso toggleestá depricated en jquery 2.0
vittore
3
Gracias vittore. Obviamente es una respuesta anterior de 2011. He actualizado la sintaxis en consecuencia.
Rion Williams
4

He creado un complemento jQuery para trabajar DRY:

$.fn.toggle2classes = function(class1, class2){
  if( !class1 || !class2 )
    return this;

  return this.each(function(){
    var $elm = $(this);

    if( $elm.hasClass(class1) || $elm.hasClass(class2) )
      $elm.toggleClass(class1 +' '+ class2);

    else
      $elm.addClass(class1);
  });
};

Puede probarlo aquí, copiar y ejecutar esto en la consola y luego intentar:

$('body').toggle2classes('a', 'b');
vsync
fuente
2

Su onClicksolicitud:

<span class="A" onclick="var state = this.className.indexOf('A') > -1; $(this).toggleClass('A', !state).toggleClass('B', state);">Click Me</span>

Pruébalo: https://jsfiddle.net/v15q6b5y/


Solo el JS à la jQuery :

$('.selector').toggleClass('A', !state).toggleClass('B', state);
gdibble
fuente
1

Aquí hay otra forma 'no convencional'.

  • Implica el uso de guión bajo o lodash .
  • Asume un contexto donde usted:
    • el elemento no tiene una clase init (eso significa que no puede hacer toggleClass ('a b'))
    • tienes que obtener la clase dinámicamente desde algún lugar

Un ejemplo de este escenario podría ser botones que tienen la clase que se debe activar en otro elemento (digamos pestañas en un contenedor).

// 1: define the array of switching classes:
var types = ['web','email'];

// 2: get the active class:
var type = $(mybutton).prop('class');

// 3: switch the class with the other on (say..) the container. You can guess the other by using _.without() on the array:
$mycontainer.removeClass(_.without(types, type)[0]).addClass(type);
Luca Reghellin
fuente
-1

La solución más fácil es para toggleClass()ambas clases individualmente.

Digamos que tienes un ícono:

    <i id="target" class="fa fa-angle-down"></i>

Para alternar fa-angle-downy fa-angle-uphacer lo siguiente:

    $('.sometrigger').click(function(){
        $('#target').toggleClass('fa-angle-down');
        $('#target').toggleClass('fa-angle-up');
    });

Como teníamos fa-angle-downal principio sin fa-angle-upcada vez que alternabas ambos, uno se va para que aparezca el otro.

Vencedor
fuente
-1

Alternar entre dos clases 'A' y 'B' con Jquery.

$ ('# selecor_id'). toggleClass ("A B");

Amor kumar
fuente