순수 JavaScript에서 요소의 클래스를 어떻게 토글합니까?


128

이 jQuery 코드 (반응 형 메뉴 섹션에서 사용됨)를 순수 JavaScript로 변환하는 방법을 찾고 있습니다.

구현하기 어려운 경우 다른 JavaScript 프레임 워크를 사용해도됩니다.

$('.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 일부 브라우저에서 지원되지 않습니다 caniuse.com/classlist을
— 케빈 휘태커를

6
안녕하세요 @max, 이미 답을 고르고 싶습니까?
— mikemaccana

답변:


213

2014 답변 : classList.toggle()표준이며 대부분의 브라우저에서 지원됩니다 .

이전 브라우저는 classList.toggle ()에 classlist.js를 사용할 수 있습니다 .

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

제쳐두고, 당신은 ID를 사용하지 않아야합니다 ( 그들은 전역을 JS window객체 로 유출 합니다 ).


ID를 사용할 수 없다면 어떻게할까요?
— Goku

하지만 이전 ID 대신 동일한 클래스 수량을 갖게되며 var myList = document.getElementsByClassName ( "abc")?
— Goku

1
@goku 클래스는 창 개체 아래에 나타나지 않습니다. ID 만 가능합니다. 참조 2ality.com/2012/08/ids-are-global.html
— mikemaccana

1
두 번째 매개 변수를 제외하고 IE10 및 IE11에서 지원
— Under the Radar

1
정말 고맙습니다! 지금 작동하고 있습니다. :) 루프에 대한 더 많은 옵션을 추가합니다. var All = document.querySelectorAll ( '. menu'); for (var i = 0; i <All.length; i ++) {All [i] .classList.toggle ( 'hidden-phone'); }
— Blue Tram

11

다음은 ES6로 구현 된 솔루션입니다.

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

사용 예

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

3
ES6는 훌륭하지만이 솔루션은 기존의 다른 답변에 대해 단순히 'document.querySelector'및 'element.classList.toggle'을 사용하는 것입니다.
— mikemaccana

"공급 업체 지향"인 경우 유효한 솔루션이 없으며 인터넷은 개방형 표준 지향 입니다.
— Peter Krauss

이것은 많은 파일에 대한 솔루션이 아닙니다. querySelectorAll (적어도 FF)에서 작동하지 않으므로 여러 요소에 대한 클래스를 전환하려는 사람들을 위해 :-) (처음에는 읽지 않았으므로 내 의견!)
— kev1807

9

이 예제를보십시오 : 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
"redOther"라는 이름의 "red"다음에 클래스가 있으면 어떻게됩니까?
— Tiffany Lowe

4

이것은 이전 버전의 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>


\b단어 경계가 CSS 클래스 이름 구분자와 일치하지 않습니다. 예를 들어 클래스 이름에 대시 ( "-")가 포함 된 경우 작동하지 않습니다. char : btn, btn-red는 모두 일치합니다 '\\b' + 'btn' + '\\b'!!
— S.Serpooshan 2019

3

이것은 아마도 더 간결 할 것입니다.

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

이것을 시도하십시오 (잘 작동 할 것입니다) :

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

다음은 className에 split ( "")을 사용하여 IE> = 9에 대한 코드입니다.

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

네이티브 솔루션을 사용하여 클래스를 요소로 전환하려면이 제안을 시도 할 수 있습니다. 나는 요소에 다른 클래스가 있든 없든 다른 경우에 그것을 맛 보았고 거의 작동한다고 생각합니다.

(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');
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.