Cách dễ nhất để chuyển đổi 2 lớp trong jQuery


218

Nếu tôi có lớp .A và lớp .B và muốn chuyển đổi giữa các lần nhấp vào nút, thì giải pháp nào tốt cho điều đó trong jQuery? Tôi vẫn không hiểu làm thế nào toggleClass()hoạt động.

Có một giải pháp nội tuyến để đưa nó vào onclick=""sự kiện?


5
Inline JS ( onclick="") là xấu. tại sao bạn không sử dụng jQuery để đăng ký một trình xử lý sự kiện thích hợp (hoặc một sự kiện đại biểu / sự kiện trực tiếp nếu bạn có nhiều yếu tố với cùng một trình xử lý)
ThiefMaster

Câu trả lời:


511

Nếu phần tử của bạn hiển thị lớp Atừ đầu, bạn có thể viết:

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

Điều này sẽ loại bỏ lớp Avà thêm lớp B. Nếu bạn làm điều đó một lần nữa, nó sẽ xóa lớp Bvà khôi phục lớp A.

Nếu bạn muốn khớp các phần tử hiển thị một trong hai lớp, bạn có thể sử dụng bộ chọn nhiều lớp và viết:

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

3
Điều gì xảy ra nếu thay vì phần tử tôi muốn đặt lớp A hoặc B tùy thuộc vào trạng thái?
Stewie Griffin

1
Xin lưu ý rằng bạn nên lưu trữ đối tượng bạn đang cố gắng chuyển đổi thay vì chọn các phần tử mỗi lần, cách sử dụng phổ biến nhất để chuyển đổi các lớp đang trong trình xử lý nhấp chuột. var $trigger = $(".A"); $trigger.on("click", function() {$trigger.toggleClass("A B")});
mummybot

1
@mummybot - được gắn cờ là hạ thấp. Frédéric - điều gì xảy ra nếu phần tử không có bất kỳ lớp nào "từ đầu"? đó là một trạng thái quan trọng là tốt.
vsync

3
Điều này không hoạt động nữa. Bây giờ thêm và loại bỏ cả hai lớp cùng một lúc.
Fabián

1
@ Frédéric Hamidi Tôi không biết mình đã làm gì sai nhưng nó không hoạt động khi tôi thử. Bây giờ có vẻ tốt. Trong trường hợp của tôi, nó đã thêm và xóa cả hai lớp cùng một lúc nhưng có vẻ như bây giờ nó đã hoạt động. Có lẽ tôi đã làm hỏng một cái gì đó khác và nó ảnh hưởng đến chức năng này. Tôi đã xóa bình luận của tôi. Xin lỗi vì sự nhầm lẫn.
BurakUeda

40

Đây là một phiên bản đơn giản hóa: ( mặc dù không thanh lịch, nhưng dễ làm theo )

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

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

});

Ngoài ra, một giải pháp tương tự:

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

3
Tôi tin rằng cách sử dụng togglenày được mô tả trong jquery 2.0
vittore

3
Cảm ơn vittore. Đây rõ ràng là một câu trả lời cũ hơn từ năm 2011. Tôi đã cập nhật cú pháp tương ứng.
Rion Williams

4

Tôi đã tạo một plugin jQuery để làm việc 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);
  });
};

Bạn chỉ có thể thử nó ở đây, sao chép và chạy nó trong bảng điều khiển và sau đó thử:

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

2

onClickYêu cầu của bạn :

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

Hãy dùng thử: https://jsfiddle.net/v15q6b5y/


Chỉ cần JS à la jQuery :

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

1

Đây là một cách 'không thông thường' khác.

  • Nó ngụ ý việc sử dụng gạch dưới hoặc lodash .
  • Nó giả định một bối cảnh nơi bạn:
    • phần tử không có lớp init (có nghĩa là bạn không thể thực hiện toggleClass ('a b'))
    • bạn phải có được lớp học năng động từ một nơi nào đó

Một ví dụ về kịch bản này có thể là các nút có lớp được bật trên một phần tử khác (giả sử các tab trong một thùng chứa).

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

Giải pháp đơn giản nhất là toggleClass() cả hai lớp riêng lẻ.

Giả sử bạn có một biểu tượng:

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

Để chuyển đổi giữa fa-angle-downfa-angle-upthực hiện các thao tác sau:

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

Vì chúng tôi đã có fa-angle-downngay từ đầu mà không có fa-angle-uplần nào bạn chuyển đổi cả hai, một cái để cái kia xuất hiện.


-1

Chuyển đổi giữa hai lớp 'A' và 'B' với Jquery.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.