요소에 JavaScript의 클래스가 포함되어 있는지 확인 하시겠습니까?


585

jQuery가 아닌 일반 JavaScript를 사용하여 요소 에 클래스 가 포함되어 있는지 확인하는 방법이 있습니까?

현재, 나는 이것을하고있다 :

var test = document.getElementById("test");
var testClass = test.className;

switch (testClass) {
  case "class1":
    test.innerHTML = "I have class1";
    break;
  case "class2":
    test.innerHTML = "I have class2";
    break;
  case "class3":
    test.innerHTML = "I have class3";
    break;
  case "class4":
    test.innerHTML = "I have class4";
    break;
  default:
    test.innerHTML = "";
}
<div id="test" class="class1"></div>

문제는 HTML을 이것으로 변경하면 ...

<div id="test" class="class1 class5"></div>

... 더 이상 정확하게 일치하지 않으므로 아무것도 ( "") 의 기본 출력을 얻습니다 . 하지만 난 여전히 출력이되고 싶어 I have class1(가) 때문에 <div>여전히 포함.class1 클래스를.


5
element.classList.contains (cls)
Ronnie Royston 2012 년

답변:


1034

사용 방법 :element.classList .contains

element.classList.contains(class);

이것은 모든 현재 브라우저에서 작동하며 이전 브라우저를 지원하기위한 폴리 필이 있습니다.


또는 이전 브라우저로 작업하고 폴리 필을 사용하여 수정하지 않으려면 사용하는 indexOf것이 맞지만 약간 조정해야합니다.

function hasClass(element, className) {
    return (' ' + element.className + ' ').indexOf(' ' + className+ ' ') > -1;
}

그렇지 않으면 true찾고있는 클래스가 다른 클래스 이름의 일부 인지도 알 수 있습니다.

데모

jQuery는 유사한 (동일하지 않은 경우) 방법을 사용합니다.


예에 적용 :

이것은 switch 문과 함께 작동하지 않으므로이 코드에서도 동일한 효과를 얻을 수 있습니다.

var test = document.getElementById("test"),
    classes = ['class1', 'class2', 'class3', 'class4'];

test.innerHTML = "";

for(var i = 0, j = classes.length; i < j; i++) {
    if(hasClass(test, classes[i])) {
        test.innerHTML = "I have " + classes[i];
        break;
    }
}

또한 덜 중복됩니다.)


굉장하지만 switch 문과 함께 사용하여 div에 포함 된 클래스를 기반으로 출력을 변경할 수 있습니까?
daGUY

@daGUY : 어쨌든 switch 문으로 무엇을 하시겠습니까? 예를 들어 두 번째 div클래스에는 두 개의 클래스가 있지만 사용하는 동안에 만 출력 I have class1됩니다 break. 요소가 가진 모든 클래스를 출력하려면 className공백을 가져 와서 분리하면됩니다. 아니면 실제 목표는 무엇입니까?
Felix Kling

@Felix Kling : 포함 된 클래스에 따라 4 개의 다른 문자열 사이에서 변경하려면 div의 innerHTML이 필요합니다. 방금 "I have class1"등을 예제로 사용했습니다. 실제 문자열은 모두 다릅니다. 한 번에 하나의 문자열 만 표시하고 어떤 문자열도 결합하지 않습니다 (따라서 각 경우마다 나누기). 일치하는 클래스가 div의 여러 클래스 중 하나 인 경우에도 여전히 작동하기를 원합니다.
daGUY

@Felix Kling : 감사합니다! 실제로 클래스의 이름을 출력하지 않고 4 개의 완전히 다른 문자열 중 하나를 출력하므로 각 IF를 처리하기 위해 몇 개의 IF / ELSE IF 문으로 약간 수정했습니다. 그래도 완벽하게 작동합니다.
daGUY

1
전후에 공백을 추가 한 특별한 이유가 있습니까?
Ced

93

쉽고 효과적인 솔루션은 .contains 방법을 시도하고 있습니다.

test.classList.contains(testClass);

3
속성 의 contains방법element.classList
user907860

7
NB! 모든 브라우저에서 지원되는 것은 아니며, 추가 정보는 다음과 같습니다. caniuse.com/#feat=classlist
Silver Ringvee

4
이것은 훌륭한 답변이며 .contains ()는 현재 훨씬 광범위한 지원을 받고 있다고 생각합니다.
Nicholas Kreidberg 2016 년

49

최신 브라우저에서는 다음 contains방법을 사용할 수 있습니다 Element.classList.

testElement.classList.contains(className)

데모

var testElement = document.getElementById('test');

console.log({
    'main' : testElement.classList.contains('main'),
    'cont' : testElement.classList.contains('cont'),
    'content' : testElement.classList.contains('content'),
    'main-cont' : testElement.classList.contains('main-cont'),
    'main-content' : testElement.classList.contains('main-content')
});
<div id="test" class="main main-content content"></div>


지원되는 브라우저

여기에 이미지 설명을 입력하십시오

( CanIUse.com에서 )


폴리 필

당신이 사용하려는 경우 Element.classList하지만 당신은 또한 이전 버전의 브라우저를 지원하려면, 사용을 고려 이 polyfill을 하여 엘리 회색 .


10

그는 switch ()를 사용하기를 원하기 때문에 아무도 이것을 아직 발표하지 않은 것에 놀랐습니다.

var test = document.getElementById("test");
var testClasses = test.className.split(" ");
test.innerHTML = "";
for(var i=0; i<testClasses.length; i++) {
    switch(testClasses[i]) {
        case "class1": test.innerHTML += "I have class1<br/>"; break;
        case "class2": test.innerHTML += "I have class2<br/>"; break;
        case "class3": test.innerHTML += "I have class3<br/>"; break;
        case "class4": test.innerHTML += "I have class4<br/>"; break;
        default: test.innerHTML += "(unknown class:" + testClasses[i] + ")<br/>";
    }
}

1
나는 똑같은 것을 궁금해했지만 네, 원래 문제와 가장 비슷합니다!
Silver Ringvee

8

Element.matches ()

element.matches (selectorString)

MDN Web Docs 에 따르면 :

Element.matches()메소드가 리턴 true요소가 지정된 선택 문자열에 의해 선택 될 경우; 그렇지 않으면를 반환합니다 false.

따라서 Element.matches()요소에 클래스가 포함되어 있는지 확인하는 데 사용할 수 있습니다 .

const element = document.querySelector('#example');

console.log(element.matches('.foo')); // true
<div id="example" class="foo bar"></div>

브라우저 호환성보기


7

다음은 약간의 스 니펫입니다. jQuery를 사용하지 않고 요소에 클래스가 포함되어 있는지 확인하십시오.

function hasClass(element, className) {
    return element.className && new RegExp("(^|\\s)" + className + "(\\s|$)").test(element.className);
}

이는 요소가 공백으로 구분 된 여러 클래스 이름을 포함 할 수 있다는 사실을 설명합니다.

또는


이 기능을 요소 프로토 타입에 할당 할 수도 있습니다.

Element.prototype.hasClass = function(className) {
    return this.className && new RegExp("(^|\\s)" + className + "(\\s|$)").test(this.className);
};

그리고 이것을 jQuery의 .hasClass()기능 과 매우 유사한 방식으로 트리거하십시오 .

document.getElementById('MyDiv').hasClass('active');

이 솔루션을 더 선호합니다. 클래스 이름이 다른 클래스와 부분적으로 일치하는 문제를 피하고 IE에서 작동하기 위해 폴리 필이 필요하지 않습니다.
scoota269

5

단순화 된 oneliner : 1

function hasClassName(classname,id) {
 return  String ( ( document.getElementById(id)||{} ) .className )
         .split(/\s/)
         .indexOf(classname) >= 0;
}

indexOf배열의 경우 1 은 IE에서 지원되지 않습니다 (물론). 인터넷에서 찾을 수있는 원숭이 패치가 많이 있습니다.


1
단어 경계의 문제점은 클래스 이름에 대한 일부 유효한 문자가 -단어 경계로 간주된다는 것입니다. 예를 들어 foo클래스는 foo-bar수율 true입니다.
Felix Kling

네 말이 맞아 원본을 제거하고 다른 접근법을 추가했습니다. 여전히 원 라이너.
KooiInc

5

이것은 조금 오래되었지만 누군가 내 솔루션이 도움이 될 수 있습니다.

// Fix IE's indexOf Array
if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function (searchElement) {
        if (this == null) throw new TypeError();
        var t = Object(this);
        var len = t.length >>> 0;
        if (len === 0) return -1;
        var n = 0;
        if (arguments.length > 0) {
            n = Number(arguments[1]);
            if (n != n) n = 0;
            else if (n != 0 && n != Infinity && n != -Infinity) n = (n > 0 || -1) * Math.floor(Math.abs(n));
        }
        if (n >= len) return -1;
        var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);
        for (; k < len; k++) if (k in t && t[k] === searchElement) return k;
        return -1;
    }
}
// add hasClass support
if (!Element.prototype.hasClass) {
    Element.prototype.hasClass = function (classname) {
        if (this == null) throw new TypeError();
        return this.className.split(' ').indexOf(classname) === -1 ? false : true;
    }
}

사용 : 'element.hasClass ('classname ');
치매

t.length >>> 0을 사용한 이유는 무엇입니까? 내가 아는 한 '0'을 사용하면 noop입니다.
Vitor Canova

간단한 것을 위해 너무 많은 코드를 와우. 왜 정규식을 사용하고 바퀴를 재발 명하지 않습니까? 당신은 /^class_name_you_are_searching_for$/.test(myElement.className)을 사용할 수 있습니다
pqsk

1
나는 너무 빨리 썼다. 정규 표현식을 지나치게 복잡하게 만들지 않으려면 /\s*class_name_you_are_searching_for\s*/.test(myElement.className)
pqsk

@ pqsk-나는 나중에 사용하기 위해 내 자신의 라이브러리를 작성합니다. 그리고 이것은 내 스택에 추가됩니다. 물론 다른 솔루션도 효과가있을 것입니다. 이것이 제가 선호하는 방식입니다
Dementic

4

className는 문자열 일 뿐이므로 일반 indexOf 함수를 사용하여 클래스 목록에 다른 문자열이 포함되어 있는지 확인할 수 있습니다.


1
class위 예제에서 클래스 테스트는 어떻습니까?
Felix Kling

6
경험상이 방법은 매우 위험 할 수 있습니다. 클래스 foo가있는 요소 에서 클래스를 찾을 때 true를 반환합니다 foobar.
Zirak

2
물론, 당신은 당신이 테스트하는 것을 알고 있습니다. Felix의 코드는 공백을 구분 기호로 사용하여 잘 작동합니다.
David

클래스 이름의 중첩 인스턴스를 설명하지 못합니다. 예 : 'end'는 클래스 이름 'frontend'에서 찾을 수 있습니다.
Anthony Rutledge

4

나는 많은 답변을 알고 있지만 대부분은 추가 기능과 추가 클래스입니다. 이것은 내가 개인적으로 사용하는 것입니다. 훨씬 더 깨끗하고 훨씬 적은 코드 줄!

if( document.body.className.match('category-page') ) { 
  console.log('yes');
}

1
예를 - 부분적으로 일치하는 클래스 이름을 검색 할 때이 방법은 오탐 (false positive)을 반환 할 수 있습니다 <body class="category-page">document.body.className.match('page')- 일치하지만 클래스가없는 page요소에 부착
hooblei

\b예를 들어 /\bpage\b/g정규 표현식이므로 으로 해결할 수 있습니다 (참고 :을 사용해야 함 / /g).
Andrew

2

대소 문자를 구분하지 않는 사소한 해결책은 다음과 같습니다.

function hasClass(element, classNameToTestFor) {
    var classNames = element.className.split(' ');
    for (var i = 0; i < classNames.length; i++) {
        if (classNames[i].toLowerCase() == classNameToTestFor.toLowerCase()) {
            return true;
        }
    }
    return false;
}

2

요소에 클래스 이름이 하나만 있으면 클래스 속성을 가져 와서 빠르게 확인할 수 있습니다. 다른 답변은 훨씬 강력하지만 분명히 유스 케이스가 있습니다.

if ( element.getAttribute('class') === 'classname' ) {

}

2

classList가능한 경우을 사용하는 프로토 타입 방법을 만들었습니다 indexOf.

Element.prototype.hasClass = Element.prototype.hasClass || 
  function(classArr){
    var hasClass = 0,
        className = this.getAttribute('class');
  
    if( this == null || !classArr || !className ) return false;
  
    if( !(classArr instanceof Array) )
      classArr = classArr.split(' ');

    for( var i in classArr )
      // this.classList.contains(classArr[i]) // for modern browsers
      if( className.split(classArr[i]).length > 1 )  
          hasClass++;

    return hasClass == classArr.length;
};


///////////////////////////////
// TESTS (see browser's console when inspecting the output)

var elm1 = document.querySelector('p');
var elm2 = document.querySelector('b');
var elm3 = elm1.firstChild; // textNode
var elm4 = document.querySelector('text'); // SVG text

console.log( elm1, ' has class "a": ', elm1.hasClass('a') );
console.log( elm1, ' has class "b": ', elm1.hasClass('b') );
console.log( elm1, ' has class "c": ', elm1.hasClass('c') );
console.log( elm1, ' has class "d": ', elm1.hasClass('d') );
console.log( elm1, ' has class "a c": ', elm1.hasClass('a c') );
console.log( elm1, ' has class "a d": ', elm1.hasClass('a d') );
console.log( elm1, ' has class "": ', elm1.hasClass('') );

console.log( elm2, ' has class "a": ', elm2.hasClass('a') );

// console.log( elm3, ' has class "a": ', elm3.hasClass('a') );

console.log( elm4, ' has class "a": ', elm4.hasClass('a') );
<p class='a b c'>This is a <b>test</b> string</p>
<svg xmlns="http://www.w3.org/2000/svg" width="100px" height="50px">
    <text x="10" y="20" class='a'>SVG Text Example</text>
</svg>

테스트 페이지


e.className의 색인 대신 classlist를 사용하려는 이유가 있습니까? 성능이 좋지 않은 것 같습니다
Ced

@Ced-클래스에 대해 수천 개의 요소를 테스트하지 않으면 perf는 관련이 없습니다 (향후 브라우저에서 리팩터링 될 것입니다). 코드가 기능을 설명하기 때문에 사용하는 것이 더 우아하지만,
요점

1
  1. 클래스 이름 옆에 공백을 추가하는 Felix의 트릭과 검색하려는 문자열은 요소에 클래스가 있는지 여부를 결정하는 올바른 방법입니다.

  2. 클래스에 따라 다른 동작을하려면 맵 내에서 함수 참조 또는 함수를 사용할 수 있습니다.

    function fn1(element){ /* code for element with class1 */ }
    
    function fn2(element){ /* code for element with class2 */ }
    
    function fn2(element){ /* code for element with class3 */ }
    
    var fns={'class1': fn1, 'class2': fn2, 'class3': fn3};
    
    for(var i in fns) {
        if(hasClass(test, i)) {
            fns[i](test);
        }
    }
    • for (var i in fns)는 fns 맵 내 키를 반복합니다.
    • fnsi 이후에 중단이 없으면 일치하는 항목이있을 때마다 코드를 실행할 수 있으므로 요소에 fi, class1 및 class2가 있으면 fn1 및 fn2가 모두 실행됩니다.
    • 이 접근법의 장점은 각 클래스에 대해 실행할 코드가 switch 문의 코드와 같이 임의적이라는 것입니다. 귀하의 예에서 모든 사례는 비슷한 작업을 수행했지만 내일에는 각기 다른 작업을 수행해야 할 수도 있습니다.
    • 루프에서 일치 여부를 알려주는 상태 변수를 사용하여 기본 사례를 시뮬레이션 할 수 있습니다.


1

이것은 약간 꺼져 있지만 스위치를 트리거하는 이벤트가 있으면 클래스없이 할 수 있습니다.

<div id="classOne1"></div>
<div id="classOne2"></div>
<div id="classTwo3"></div>

넌 할 수있어

$('body').click( function() {

    switch ( this.id.replace(/[0-9]/g, '') ) {
        case 'classOne': this.innerHTML = "I have classOne"; break;
        case 'classTwo': this.innerHTML = "I have classTwo"; break;
        default: this.innerHTML = "";
    }

});

.replace(/[0-9]/g, '')에서 숫자를 제거합니다 id.

약간 해 키지 만 추가 기능이나 루프가없는 긴 스위치에서 작동합니다.


1

vanilla JavaScript를 사용하여 특정 클래스가있는 경우 요소를 빠르고 쉽게 확인하는 방법은이 Codepen 링크를 참조하십시오 ~!

hasClass (바닐라 JS)

function hasClass(element, cls) {
    return (' ' + element.className + ' ').indexOf(' ' + cls + ' ') > -1;
}

1

이것은 IE8 +에서 지원됩니다.

먼저 classList존재하는 경우 containsIE10 +에서 지원 하는 방법을 사용할 수 있는지 확인합니다 . 우리가 IE9 또는 8을 사용하는 경우 정규 표현식을 사용하는 것으로 돌아갑니다. 이는 효율적이지 않지만 간결한 폴리 필입니다.

if (el.classList) {
  el.classList.contains(className);
} else {
  new RegExp('(^| )' + className + '( |$)', 'gi').test(el.className);
}

또는 babel로 컴파일하는 경우 간단하게 사용할 수 있습니다. el.classList.contains(className);


0

이거 한번 해봐:

document.getElementsByClassName = function(cl) {
   var retnode = [];
   var myclass = new RegExp('\\b'+cl+'\\b');
   var elem = this.getElementsByTagName('*');
   for (var i = 0; i < elem.length; i++) {
       var classes = elem[i].className;
       if (myclass.test(classes)) retnode.push(elem[i]);
   }
    return retnode;
};

1
단어 경계에주의하십시오. 예를 들어 클래스가 있고을 foo-bar검색 하는 경우에도 일치합니다 foo.
Felix Kling

1
안녕 지미, 그래서이 \ b 메타 문자를 검색하고 [ a-zA-Z0-9_] 만 단어 문자로 간주 합니다. 따라서 빼기 문자가 포함 된 클래스 이름의 경우 작동하지 않습니다 .
Stano

0

완벽한 해결책은 이것이라고 생각합니다.

if ($(this).hasClass("your_Class")) 
    alert("positive");            
else              
    alert("Negative");

8
1. "일반 자바 스크립트 사용 (jQuery 아님)"2. 괄호 사용
nkmol

3-괄호 사용
TheBlackBenzKid

0

어떤 요소에서 현재 '.bar'클래스입니까? 여기 또 다른 해결책이 있지만 그것은 당신에게 달려 있습니다.

var reg = /Image/g, // regexp for an image element
query = document.querySelector('.bar'); // returns [object HTMLImageElement]
query += this.toString(); // turns object into a string

if (query.match(reg)) { // checks if it matches
  alert('the class .bar is attached to the following Element:\n' + query);
}

jsfiddle 데모

물론 이것은 하나의 간단한 요소 <img>( /Image/g)에 대한 조회 일뿐 이지만 <li>is /LI/g, <ul>= /UL/g등 의 배열에 모두 넣을 수 있습니다 .


0

인라인 SVG 요소 내에서 클래스 이름을 찾으려고 노력하는 사람들에게 답을 추가하십시오.

hasCLass()기능을 다음과 같이 변경하십시오 .

function hasClass(element, cls) {
    return (' ' + element.getAttribute('class') + ' ').indexOf(' ' + cls + ' ') > -1;
  }

className속성 을 사용하는 대신 getAttribute()메서드를 사용 하여 클래스 이름을 가져와야합니다.


0

나는 내 웹 사이트를 위해 이러한 기능을 만들었으며 바닐라 자바 ​​스크립트 만 사용합니다. 아마도 누군가를 도울 것입니다. 먼저 HTML 요소를 얻는 함수를 만들었습니다.

//return an HTML element by ID, class or tag name
    var getElement = function(selector) {
        var elements = [];
        if(selector[0] == '#') {
            elements.push(document.getElementById(selector.substring(1, selector.length)));
        } else if(selector[0] == '.') {
            elements = document.getElementsByClassName(selector.substring(1, selector.length));
        } else {
            elements = document.getElementsByTagName(selector);
        }
        return elements;
    }

그런 다음 제거 할 클래스와 요소의 선택자를받는 함수 :

var hasClass = function(selector, _class) {
        var elements = getElement(selector);
        var contains = false;
        for (let index = 0; index < elements.length; index++) {
            const curElement = elements[index];
            if(curElement.classList.contains(_class)) {
                contains = true;
                break;
            }
        }
        return contains;
    }

이제 다음과 같이 사용할 수 있습니다.

hasClass('body', 'gray')
hasClass('#like', 'green')
hasClass('.button', 'active')

그것이 도움이되기를 바랍니다.


0

팁 : 가능한 한 프로젝트에서 jQuery의 종속성을 제거하십시오 ( VanillaJS) .

document.firstElementChild<html>태그를 반환 하면 classList속성이 추가 된 모든 클래스를 반환합니다.

if(document.firstElementChild.classList.contains("your-class")){
    // <html> has 'your-class'
} else {
    // <html> doesn't have 'your-class'
}

-1

나를 위해 가장 우아하고 빠른 방법은 다음과 같습니다.

function hasClass(el,cl){
   return !!el.className && !!el.className.match(new RegExp('\\b('+cl+')\\b'));
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.