Làm cách nào để chuyển đổi lớp của một phần tử trong JavaScript thuần túy?


128

Tôi đang tìm cách chuyển đổi mã jQuery này (được sử dụng trong phần menu đáp ứng) sang JavaScript thuần túy.

Nếu khó triển khai, bạn có thể sử dụng các khung JavaScript khác.

$('.btn-navbar').click(function()
{
    $('.container-fluid:first').toggleClass('menu-hidden');
    $('#menu').toggleClass('hidden-phone');

    if (typeof masonryGallery != 'undefined') 
        masonryGallery();
});


11
document.getElementById("menu").classList.toggle("hidden-phone"):-)
Bergi

classList không được một số trình duyệt hỗ trợ: caniuse.com/classlist
Kevin Whitaker

6
Này @max, muốn chọn câu trả lời chưa?
mikemaccana

Câu trả lời:


213

Câu trả lời năm 2014 : classList.toggle()là tiêu chuẩn và được hỗ trợ bởi hầu hết các trình duyệt .

Các trình duyệt cũ hơn có thể sử dụng use classlist.js cho classList.toggle () :

var menu = document.querySelector('.menu') // Using a class instead, see note below.
menu.classList.toggle('hidden-phone');

Ngoài ra, bạn không nên sử dụng ID ( chúng làm rò rỉ các hình cầu vào windowđối tượng JS ).


nếu chúng ta không thể sử dụng ID, thì làm thế nào chúng ta làm điều đó?
Goku

nhưng, sau đó chúng ta sẽ có cùng số lượng các lớp thay vì các ID cũ và sử dụng một cái gì đó như var myList = document.getElementsByClassName ("abc")?
Goku

1
Các lớp @goku không xuất hiện bên dưới đối tượng cửa sổ. Chỉ có ID mới làm. Xem 2ality.com/2012/08/ids-are-global.html
mikemaccana

1
Được hỗ trợ bởi IE10 và IE11 ngoại trừ tham số thứ hai
Bên dưới Radar

1
Cảm ơn bạn rất nhiều! Nó đang hoạt động :) Tôi thêm tùy chọn khác cho vòng lặp: var All = document.querySelectorAll ('. Menu'); for (var i = 0; i <All.length; i ++) {Tất cả [i] .classList.toggle ('hidden-phone'); }
Blue Tram

11

Đây là giải pháp được thực hiện với ES6

const toggleClass = (el, className) => el.classList.toggle(className);

ví dụ sử dụng

toggleClass(document.querySelector('div.active'), 'active'); // The div container will not have the 'active' class anymore

3
ES6 là tuyệt vời, nhưng giải pháp này chỉ đơn giản là sử dụng 'document.querySelector' và 'element.classList.toggle' cho các câu trả lời hiện có khác.
mikemaccana

Không có giải pháp nào là hợp lệ nếu nó là "định hướng nhà cung cấp", Internet là định hướng tiêu chuẩn mở .
Peter Krauss

đây không phải là giải pháp cho vô số tệp. không hoạt động với querySelectorAll (ít nhất là trong FF), vì vậy đối với những người muốn chuyển đổi các lớp trên nhiều phần tử, hãy đọc trên :-) (Lúc đầu tôi không đọc - do đó nhận xét của tôi!)
kev1807

9

Hãy xem ví dụ này: JS Fiddle

function toggleClass(element, className){
    if (!element || !className){
        return;
    }

    var classString = element.className, nameIndex = classString.indexOf(className);
    if (nameIndex == -1) {
        classString += ' ' + className;
    }
    else {
        classString = classString.substr(0, nameIndex) + classString.substr(nameIndex+className.length);
    }
    element.className = classString;
}

9
Điều gì sẽ xảy ra nếu tôi có một lớp sau "red" có tên "redOther"?
Tiffany Lowe

4

Cái này cũng hoạt động trong các phiên bản trước của IE.

function toogleClass(ele, class1) {
  var classes = ele.className;
  var regex = new RegExp('\\b' + class1 + '\\b');
  var hasOne = classes.match(regex);
  class1 = class1.replace(/\s+/g, '');
  if (hasOne)
    ele.className = classes.replace(regex, '');
  else
    ele.className = classes + class1;
}
.red {
  background-color: red
}
div {
  width: 100px;
  height: 100px;
  margin-bottom: 10px;
  border: 1px solid black;
}
<div class="does red redAnother " onclick="toogleClass(this, 'red')"></div>

<div class="does collapse navbar-collapse " onclick="toogleClass(this, 'red')"></div>


\branh giới từ không nhất quán với trình phân tách tên lớp css. Ví dụ, nó không hoạt động nếu tên lớp chứa dấu gạch ngang ("-") char: btn, btn-red cả hai sẽ khớp '\\b' + 'btn' + '\\b'!!
S.Serpooshan

3

Điều này có lẽ ngắn gọn hơn:

function toggle(element, klass) {
  var classes = element.className.match(/\S+/g) || [],
      index = classes.indexOf(klass);

  index >= 0 ? classes.splice(index, 1) : classes.push(klass);
  element.className = classes.join(' ');
}

0

Hãy thử điều này (hy vọng nó sẽ hoạt động):

// mixin (functionality) for toggle class 
function hasClass(ele, clsName) {
    var el = ele.className;
    el = el.split(' ');
    if(el.indexOf(clsName) > -1){
        var cIndex = el.indexOf(clsName);
        el.splice(cIndex, 1);
        ele.className = " ";
        el.forEach(function(item, index){
          ele.className += " " + item;
        })
    }
    else {
        el.push(clsName);
        ele.className = " ";
        el.forEach(function(item, index){
          ele.className += " " + item;
        })
    }
}

// get all DOM element that we need for interactivity.

var btnNavbar =  document.getElementsByClassName('btn-navbar')[0];
var containerFluid =  document.querySelector('.container-fluid:first');
var menu = document.getElementById('menu');

// on button click job
btnNavbar.addEventListener('click', function(){
    hasClass(containerFluid, 'menu-hidden');
    hasClass(menu, 'hidden-phone');
})`enter code here`

0

Đây là mã cho IE> = 9 bằng cách sử dụng split ("") trên className:

function toggleClass(element, className) {
    var arrayClass = element.className.split(" ");
    var index = arrayClass.indexOf(className);

    if (index === -1) {
        if (element.className !== "") {
            element.className += ' '
        }
        element.className += className;
    } else {
        arrayClass.splice(index, 1);
        element.className = "";
        for (var i = 0; i < arrayClass.length; i++) {
            element.className += arrayClass[i];
            if (i < arrayClass.length - 1) {
                element.className += " ";
            }
        }
    }
}

0

Nếu bạn muốn chuyển đổi một lớp thành một phần tử bằng cách sử dụng giải pháp gốc, bạn có thể thử đề xuất này. Tôi đã nếm thử nó trong các trường hợp khác nhau, có hoặc không có các lớp khác trên phần tử và tôi nghĩ rằng nó hoạt động khá nhiều:

(function(objSelector, objClass){
   document.querySelectorAll(objSelector).forEach(function(o){
      o.addEventListener('click', function(e){
        var $this = e.target,
            klass = $this.className,
            findClass = new RegExp('\\b\\s*' + objClass + '\\S*\\s?', 'g');

        if( !findClass.test( $this.className ) )
            if( klass ) 
                $this.className = klass + ' ' + objClass;
            else 
                $this.setAttribute('class', objClass);
        else 
        {
            klass = klass.replace( findClass, '' );
            if(klass) $this.className = klass;
            else $this.removeAttribute('class');
        }
    });
  });
})('.yourElemetnSelector', 'yourClass');
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.