순수 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.