Najłatwiejszym sposobem przełączania 2 klas w jQuery

218

Jeśli mam klasę .A i klasę .B i chcę przełączać się między kliknięciem przycisku, jakie jest dobre rozwiązanie w jQuery? Nadal nie rozumiem, jak to toggleClass()działa.

Czy istnieje jakieś rozwiązanie na miejscu, aby to zrobić onclick=""?

Stewie Griffin
źródło
5
Inline JS ( onclick="") jest zła. dlaczego nie użyjesz jQuery do zarejestrowania odpowiedniego modułu obsługi zdarzeń (lub wydarzenia delegowanego / na żywo, jeśli masz wiele elementów z tym samym
modułem

Odpowiedzi:

511

Jeśli twój element odsłania klasę Aod samego początku, możesz napisać:

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

Spowoduje to usunięcie klasy Ai dodanie klasy B. Jeśli zrobisz to ponownie, usunie klasę Bi przywróci klasę A.

Jeśli chcesz dopasować elementy eksponujące dowolną klasę, możesz użyć selektora wielu klas i napisać:

$(".A, .B").toggleClass("A B");
Frédéric Hamidi
źródło
3
co jeśli zamiast elementu chcę umieścić klasę A lub B w zależności od stanu?
Stewie Griffin,
1
Pamiętaj, że powinieneś buforować obiekt, który próbujesz przełączać, zamiast wybierać elementy za każdym razem, najczęstszym zastosowaniem przełączania klas jest procedura obsługi kliknięć. var $trigger = $(".A"); $trigger.on("click", function() {$trigger.toggleClass("A B")});
Mummybot
1
@ Mummybot - oflagowany jako protekcjonalny. Frédéric - co jeśli element nie ma żadnej klasy „od samego początku”? to także ważny stan.
vsync,
3
To już nie działa. Teraz dodaje i usuwa obie klasy jednocześnie.
Fabián
1
@ FrédéricHamidi Nie wiem, co zrobiłem źle, ale nie działało, kiedy próbowałem. Teraz wydaje się w porządku. W moim przypadku dodałem i usunąłem obie klasy w tym samym czasie, ale wydaje się, że teraz działa. Prawdopodobnie coś pomieszałem i wpłynęło to na tę funkcję. Usunąłem swój komentarz. Przepraszam za zamieszanie.
BurakUeda,
40

Oto uproszczona wersja: ( choć nie elegancka, ale łatwa do naśladowania )

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

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

});

Alternatywnie podobne rozwiązanie:

$('#yourbutton').click(function()
{
     $('#target').toggleClass('a b'); //Adds 'a', removes 'b' and vice versa
});
Rion Williams
źródło
3
Wierzę, że ten sposób użycia togglejest utrudniony w jquery 2.0
vittore
3
Dzięki Vittore. To oczywiście starsza odpowiedź z 2011 roku. Zaktualizowałem odpowiednio składnię.
Rion Williams,
4

Zrobiłem wtyczkę jQuery do pracy 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);
  });
};

Możesz po prostu spróbować tutaj, skopiować i uruchomić to w konsoli, a następnie spróbować:

$('body').toggle2classes('a', 'b');
vsync
źródło
2

Twoja onClickprośba:

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

Wypróbuj: https://jsfiddle.net/v15q6b5y/


Tylko JS à la jQuery :

$('.selector').toggleClass('A', !state).toggleClass('B', state);
gdibble
źródło
1

Oto inny „niekonwencjonalny” sposób.

  • Oznacza to użycie podkreślenia lub lodash .
  • Zakłada kontekst, w którym:
    • element nie ma klasy init (co oznacza, że ​​nie można przełączać klasy („a b”))
    • musisz skądś uzyskać klasę dynamicznie

Przykładem tego scenariusza mogą być przyciski, w których klasę można włączyć na innym elemencie (np. Tabulatory w kontenerze).

// 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
źródło
-1

Najłatwiejszym rozwiązaniem jest dla toggleClass()obu klas indywidualnie.

Powiedzmy, że masz ikonę:

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

Aby przełączyć między fa-angle-downi fa-angle-upwykonaj następujące czynności:

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

Ponieważ mieliśmy fa-angle-downna początku, bez fa-angle-upkażdorazowego przełączania obu, jedno wychodzi, aby drugie się pojawiło.

Zwycięzca
źródło
-1

Przełączaj się między dwiema klasami „A” i „B” za pomocą Jquery.

$ ('# selecor_id'). toggleClass („A B”);

Uwielbiam Kumar
źródło