Il modo più semplice per attivare / disattivare 2 classi in jQuery


218

Se ho una classe .A e una classe .B e voglio passare da un pulsante all'altro, qual è una buona soluzione in jQuery? Ancora non capisco come toggleClass()funziona.

Esiste una soluzione in linea per metterlo in atto onclick=""?


5
Inline JS ( onclick="") è male. perché non usi jQuery per registrare un gestore di eventi adeguato (o un evento delegato / live se hai molti elementi con lo stesso gestore)
ThiefMaster

Risposte:


511

Se il tuo elemento espone la classe Adall'inizio, puoi scrivere:

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

Ciò rimuoverà la classe Ae aggiungerà la classe B. Se lo fai di nuovo, rimuoverà la classe Be ripristinerà la classe A.

Se si desidera abbinare gli elementi che espongono entrambe le classi, è possibile utilizzare un selettore di più classi e scrivere:

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

3
cosa succede se invece dell'elemento voglio mettere la classe A o B a seconda dello stato?
Stewie Griffin,

1
Tenere presente che è necessario memorizzare nella cache l'oggetto che si sta tentando di attivare / disattivare anziché selezionare gli elementi ogni volta, l'utilizzo più comune per attivare / disattivare le classi è in un gestore di clic. var $trigger = $(".A"); $trigger.on("click", function() {$trigger.toggleClass("A B")});
mummybot,

1
@mummybot: contrassegnato come condiscendente. Frédéric: cosa succede se l'elemento non ha alcuna classe "dall'inizio"? anche questo è uno stato importante.
vsync,

3
Questo non funziona più. Ora aggiunge e rimuove entrambe le classi contemporaneamente.
Fabián,

1
@ FrédéricHamidi Non so cosa ho fatto di sbagliato ma non ha funzionato quando ho provato. Ora sembra a posto. Nel mio caso, ha aggiunto e rimosso entrambe le classi contemporaneamente, ma sembra funzionare ora. Probabilmente ho incasinato qualcos'altro e ha influito su questa funzione. Ho cancellato il mio commento. Dispiace per la confusione.
BurakUeda,

40

Ecco una versione semplificata: ( anche se non elegante, ma facile da seguire )

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

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

});

In alternativa, una soluzione simile:

$('#yourbutton').click(function()
{
     $('#target').toggleClass('a b'); //Adds 'a', removes 'b' and vice versa
});

3
Credo che questo modo di usare togglesia deprecato in jquery 2.0
vittore

3
Grazie vittore. È ovviamente una risposta più vecchia del 2011. Ho aggiornato la sintassi di conseguenza.
Rion Williams,

4

Ho creato un plugin jQuery per lavorare a SECCO:

$.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);
  });
};

Puoi semplicemente provarlo qui, copiarlo ed eseguirlo nella console e quindi provare:

$('body').toggle2classes('a', 'b');

2

La tua onClickrichiesta:

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

Provalo: https://jsfiddle.net/v15q6b5y/


Solo il JS à la jQuery :

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

1

Ecco un altro modo "non convenzionale".

  • Implica l'uso di underscore o lodash .
  • Presuppone un contesto in cui:
    • l'elemento non ha una classe init (ciò significa che non puoi fare toggleClass ('a b'))
    • devi prendere la classe in modo dinamico da qualche parte

Un esempio di questo scenario potrebbe essere rappresentato dai pulsanti con la classe da attivare su un altro elemento (ad esempio le schede in un contenitore).

// 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);

-1

La soluzione più semplice è per toggleClass()entrambe le classi individualmente.

Diciamo che hai un'icona:

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

Per passare da una all'altra fa-angle-downe fa-angle-upprocedere come segue:

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

Dal momento che abbiamo avuto fa-angle-downall'inizio senza fa-angle-upogni volta che si attivano entrambi, uno parte per l'altro apparire.


-1

Passa tra due classi 'A' e 'B' con Jquery.

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.