일반 JavaScript를 사용한 "hasClass"기능은 무엇입니까?


313

hasClass일반 ol 'JavaScript로 jQuery를 어떻게 수행 합니까? 예를 들어

<body class="foo thatClass bar">

JavaScript를 사용하는 방법 <body>thatClass무엇입니까?


class속성 을 구문 분석하고 (여러 클래스의 경우 여러 개의 클래스 이름을 공백으로 구분하여 임의의 순서로 정렬해야 함) 클래스 이름이 있는지 확인해야한다고 가정합니다. 어렵지 않지만 학습 목적이 아니라면 여전히 불편합니다 :)
Pekka

7
내가 파티에 늦었는지 모르지만 jQuery 기능의 대안을 제공하는 좋은 사이트는 youmightnotneedjquery.com
ithil

답변:


116

element.className일치 하는지 확인할 수 있습니다 /\bthatClass\b/.
\b단어 나누기와 일치합니다.

또는 jQuery 자체 구현을 사용할 수 있습니다.

var className = " " + selector + " ";
if ( (" " + element.className + " ").replace(/[\n\t]/g, " ").indexOf(" thatClass ") > -1 ) 

더 일반적인 질문에 대답하기 위해 github에서 또는 이 소스 뷰어에서 소스 의 jQuery 소스 코드 를 볼 수 있습니다 .hasClass


6
jQuery 구현의 경우 +1 ( rclass실제로 찾은 것이 (이 적절한 영어입니까? ))
Felix Kling

6
\b"thatClass-anotherClass"와 일치 하지 않습니까?
Matthew Crumley

3
완전성을 위해 : 최신 버전의 rclass는 "/ [\ n \ t \ r] / g"입니다 (\ r 추가됨)
Felix Schwarz

4
@FelixSchwarz가 맞습니다. 현재 jQuery에서 정규 표현식이로 업데이트되었습니다 /[\t\r\n\f]/g. 또한 마이너스 부호가있는 /\bclass\b/클래스 이름 -(실제로 작동하지 않음)에 실패 할 수 있다고 언급하는 것이 좋습니다. 그래서 jQuery의 구현이 더 좋고 안정적입니다. 예를 들어 : /\bbig\b/.test('big-text')예상되는 false 대신 true를 반환합니다.
Stano

994

간단히 사용하십시오 classList.contains():

if (document.body.classList.contains('thatClass')) {
    // do some stuff
}

다른 용도 classList:

document.body.classList.add('thisClass');
// $('body').addClass('thisClass');

document.body.classList.remove('thatClass');
// $('body').removeClass('thatClass');

document.body.classList.toggle('anotherClass');
// $('body').toggleClass('anotherClass');

브라우저 지원 :

  • 크롬 8.0
  • Firefox 3.6
  • IE 10
  • 오페라 11.50
  • 사파리 5.1

classList 브라우저 지원


5
이것은 IE8에서 지원되지 않습니다 . IE8은 .classList문자열로 검색 할 수 있지만 다음과 같은보다 현대적인 방법을 인식하지 못합니다..classList.contains()
iono


3
@AlexanderWigmore에 동의합니다. 이것은 매우 유용하고 간단했습니다.
Jacques Olivier

이것을 투표하십시오. 이것은 클래스를 쿼리하는 훨씬 더 깔끔한 방법입니다.
user2190488

@ SLaks 이미 수락 된 답변으로 업데이트해야합니다.
Umur Karagöz

35

가장 효과적인 라이너

  • 부울을 반환합니다 (Orbling의 답변과 반대).
  • thisClass가있는 요소를 검색 할 때 오 탐지를 반환하지 않습니다 class="thisClass-suffix".
  • IE6 이상까지 모든 브라우저와 호환 가능

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

28

사용중인 클래스를 저장하는 속성은 className입니다.

그래서 당신은 말할 수 있습니다 :

if (document.body.className.match(/\bmyclass\b/)) {
    ....
}

jQuery가 모든 것을 수행하는 방법을 보여주는 위치를 원한다면 다음을 제안합니다.

http://code.jquery.com/jquery-1.5.js


1
우수한. 이 match속성은 다시 유용합니다! 실제로 jQuery는 JavaScript에서 가능한 것 이상을 수행합니까?! 그렇지 않은 경우 jQuery는 불필요한 속기입니다.
animaacija

1
이것은 또한 일치 myclass-something로, \b경기 하이픈.
Marc Durdin 2016 년

1
@animaacija 모든 자바 스크립트 라이브러리 / 플러그인은 자바 스크립트로 빌드되므로 기본적으로 자바 스크립트 속기입니다. 것은 : 속기는 항상 필요하다. 바퀴를 재발 명하지 마십시오.
Edwin Stoteler

이것은 훌륭한 솔루션입니다!
Manuel Abascal

28

// 1. Use if for see that classes:

if (document.querySelector(".section-name").classList.contains("section-filter")) {
  alert("Grid section");
  // code...
}
<!--2. Add a class in the .html:-->

<div class="section-name section-filter">...</div>


4
@greg_diesel : 답변을 낙담하지 마십시오! 일반적인 문제에 대한 새로운 솔루션은 환영 이상입니다.
raveren

2
@Raveren은 오래된 문제에 대한 새로운 솔루션을 환영하지만이 특정 답변은 새로운 것을 제공하지 않습니다. 이 질문에 소음 만 추가합니다.
Emile Bergeron

1
@raveren 이것은 새로운 해결책이 아니며, 이 답변 과 동일 하지만 정보는 적습니다.
Fund Monica의 소송 22:57에

13

hasClass 함수 :

HTMLElement.prototype.hasClass = function(cls) {
    var i;
    var classes = this.className.split(" ");
    for(i = 0; i < classes.length; i++) {
        if(classes[i] == cls) {
            return true;
        }
    }
    return false;
};

addClass 함수 :

HTMLElement.prototype.addClass = function(add) {
    if (!this.hasClass(add)){
        this.className = (this.className + " " + add).trim();
    }
};

removeClass 함수 :

HTMLElement.prototype.removeClass = function(remove) {
    var newClassName = "";
    var i;
    var classes = this.className.replace(/\s{2,}/g, ' ').split(" ");
    for(i = 0; i < classes.length; i++) {
        if(classes[i] !== remove) {
            newClassName += classes[i] + " ";
        }
    }
    this.className = newClassName.trim();
};

11

나는 단순 / 최소 솔루션, 한 줄, 크로스 브라우저를 사용하고 레거시 브라우저에서도 작동합니다.

/\bmyClass/.test(document.body.className) // notice the \b command for whole word 'myClass'

이 방법은 폴리 필을 필요로하지 않기 때문에 유용합니다.classList 성능면에서 훨씬 좋습니다. 적어도 나에게는.

업데이트 : 나는 지금 사용하는 모든 라운드 솔루션 인 작은 폴리 필을 만들었습니다.

function hasClass(element,testClass){
  if ('classList' in element) { return element.classList.contains(testClass);
} else { return new Regexp(testClass).exec(element.className); } // this is better

//} else { return el.className.indexOf(testClass) != -1; } // this is faster but requires indexOf() polyfill
  return false;
}

다른 클래스 조작에 대해서는 여기 에서 전체 파일을 참조 하십시오 .


2
이 여행은 클래스를 통해 진행 notmyClassHere됩니까?
Teepeemm

2
당신은 또한 당신의 수업이 없는지 물어볼 수있을뿐만 아니라 상징을 !/myClass/.test(document.body.className)알아 차릴 수도 !있습니다.
thednp

1
나는 질문을 부정하는 것에 대해 이야기하고 있지 않습니다. 클래스 이름이 인 경우 함수가 부적절하게 true를 반환한다고 생각합니다 thisIsmyClassHere.
Teepeemm

1
나는 그것이 당신이 요구하는 것만 추측하고, 당신이 필요한 것을 정확히 이해하지 못했지만, 시도해 보았지만 그것이 참 / 거짓을 반환하지 못했습니다?
thednp

2
하위 문자열 증거가 아니기 때문에 완벽하지 않습니다. 예를 들어 document.body.className = 'myClass123'이면 /myClass/.test(document.body.className)이 true를 반환합니다.
Zbigniew Wiadro

9

이에 대한 좋은 해결책은 classList와 함께 작동하고 포함하는 것입니다.

나는 이것을 이렇게했다 :

... for ( var i = 0; i < container.length; i++ ) {
        if ( container[i].classList.contains('half_width') ) { ...

따라서 요소가 필요하고 클래스 목록을 확인하십시오. 클래스 중 하나가 검색 한 클래스와 동일하면 true를 반환하고 그렇지 않으면 false를 반환합니다.


6

다음과 같은 것을 사용하십시오 :

Array.prototype.indexOf.call(myHTMLSelector.classList, 'the-class');

3
이것과 같지 myHTMLSelector.classList.indexOf('the-class')않습니까? 당신은 또한 >=0마지막에 원하지 않습니까?
Teepeemm

5
메소드 가있는 [].indexOf경우 사용의 요점은 무엇입니까 ? classListcontains
Oriol

@Teepeemm 번호 배열이 아니기 때문에 myHTMLSelector.classList.indexOf('the-class')오류를 반환합니다 . 그러나 일부 변환을 사용하여 호출하면 발생합니다. 이전 브라우저를 지원할 수도 있지만 매우 좋은 지원을 제공합니다. myHTMLSelector.classList.indexOf is not a functionmyHTMLSelector.classListArray.prototypecontains
Ehsan88


2

이 'hasClass'기능은 IE8 +, FireFox 및 Chrome에서 작동합니다.

hasClass = function(el, cls) {
    var regexp = new RegExp('(\\s|^)' + cls + '(\\s|$)'),
        target = (typeof el.className === 'undefined') ? window.event.srcElement : el;
    return target.className.match(regexp);
}

1

위의 모든 대답은 꽤 좋지만 여기에 작은 간단한 기능이 있습니다. 꽤 잘 작동합니다.

function hasClass(el, cn){
    var classes = el.classList;
    for(var j = 0; j < classes.length; j++){
        if(classes[j] == cn){
            return true;
        }
    }
}

3
방법 classList이 있다면 반복하는 요점은 무엇입니까 contains?
Oriol

1

이 접근법에 대해 어떻게 생각하십니까?

<body class="thatClass anotherClass"> </body>

var bodyClasses = document.querySelector('body').className;
var myClass = new RegExp("thatClass");
var trueOrFalse = myClass.test( bodyClasses );

https://jsfiddle.net/5sv30bhe/


2
변수 이름을 혼합한다고 생각합니다 (active === myClass?). 그러나이 접근법은 거짓 긍정을주지 class="nothatClassIsnt"않습니까?
Teepeemm

0

가장 간단한 방법은 다음과 같습니다.

var allElements = document.querySelectorAll('*');
for (var i = 0; i < allElements.length; i++) {
    if (allElements[i].hasAttribute("class")) {
         //console.log(allElements[i].className);
         if (allElements[i].className.includes("_the _class ")) { 
              console.log("I see the class");
         }
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.