Самый простой способ переключить 2 класса в jQuery

218

Если у меня есть класс .A и класс .B, и я хочу переключаться между ними по нажатию кнопки, что является хорошим решением для этого в jQuery? Я до сих пор не понимаю, как toggleClass()работает.

Есть встроенное решение, чтобы поместить это в onclick=""событие?

Стьюи Гриффин
источник
5
Встроенный JS ( onclick="") плохо. почему вы не используете jQuery для регистрации правильного обработчика событий (или делегата / живого события, если у вас много элементов с одним и тем же обработчиком)
ThiefMaster

Ответы:

512

Если ваш элемент предоставляет класс Aс самого начала, вы можете написать:

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

Это удалит класс Aи добавит класс B. Если вы сделаете это снова, он удалит класс Bи восстановит класс A.

Если вы хотите сопоставить элементы, которые предоставляют любой класс, вы можете использовать множественный селектор классов и написать:

$(".A, .B").toggleClass("A B");
Фредерик Хамиди
источник
3
что если вместо элемента я хочу поставить класс А или В в зависимости от состояния?
Стьюи Гриффин
1
Имейте в виду, что вы должны кэшировать объект, который вы пытаетесь переключать, а не выбирать элементы каждый раз, наиболее распространенное использование для переключения классов в обработчике щелчков. var $trigger = $(".A"); $trigger.on("click", function() {$trigger.toggleClass("A B")});
мамочка
1
@mummybot - помечен как снисходительный. Фредерик - что если элемент не имеет никакого класса "с самого начала"? это тоже важное состояние.
vsync
3
Это больше не работает. Теперь добавляет и удаляет оба класса одновременно.
Фабиан
1
@ FrédéricHamidi Я не знаю, что я сделал неправильно, но когда я пытался, это не сработало. Сейчас вроде нормально. В моем случае он добавил и удалил оба класса одновременно, но сейчас это работает. Возможно, я перепутал что-то еще, и это повлияло на эту функцию. Я удалил свой комментарий. Извините за путаницу.
Буракуэда
40

Вот упрощенная версия: ( хотя и не элегантно, но легко читаемо )

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

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

});

В качестве альтернативы аналогичное решение:

$('#yourbutton').click(function()
{
     $('#target').toggleClass('a b'); //Adds 'a', removes 'b' and vice versa
});
Рион Уильямс
источник
3
Я верю, что этот способ использования toggleзапрещен в jquery 2.0
vittore
3
Спасибо витторе. Это, очевидно, более старый ответ от 2011 года. Я обновил синтаксис соответственно.
Рион Уильямс
4

Я сделал плагин JQuery для работы 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);
  });
};

Вы можете просто попробовать это здесь, скопировать и запустить это в консоли, а затем попробуйте:

$('body').toggle2classes('a', 'b');
VSync
источник
2

Ваш onClickзапрос:

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

Попробуйте это: https://jsfiddle.net/v15q6b5y/


Просто JS à la jQuery :

$('.selector').toggleClass('A', !state).toggleClass('B', state);
gdibble
источник
1

Вот еще один «нетрадиционный» способ.

  • Это подразумевает использование подчеркивания или lodash .
  • Это предполагает контекст, в котором вы:
    • элемент не имеет класса init (это означает, что вы не можете сделать toggleClass ('a b'))
    • вы должны получить класс динамически откуда-то

Примером этого сценария могут быть кнопки, у которых есть класс для переключения на другой элемент (скажем, вкладки в контейнере).

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

Самое простое решение - это toggleClass() обоих классов в отдельности.

Допустим, у вас есть значок:

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

Для переключения между fa-angle-downи fa-angle-upсделайте следующее:

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

Так fa-angle-downкак в начале у нас было не fa-angle-upкаждый раз, когда вы переключаете оба, один уходит, а другой появляется.

преодолевающим
источник
-1

Переключайтесь между двумя классами «A» и «B» с помощью Jquery.

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

Люблю кумар
источник