jQuery hasClass ()-둘 이상의 클래스 확인


162

와:

if(element.hasClass("class"))

하나의 클래스를 확인할 수 있지만 "요소"에 많은 클래스가 있는지 쉽게 확인할 수 있습니까?

나는 사용하고있다 :

if(element.hasClass("class") || element.hasClass("class") ... )

나쁘지는 않지만 다음과 같은 것을 생각하고 있습니다.

if(element.hasClass("class", "class2")

불행히도 작동하지 않습니다.

그런게 있습니까?

답변:


227

어때요?

element.is('.class1, .class2')

9
아니요, 두 클래스가 모두있는 요소를 찾을 것이기 때문입니다. Marcel은 하나 이상의 클래스가있는 요소를 찾고 있다고 생각합니다.
Giles Van Gruisen

방금 거기에 4 개의 id = "hello"요소가 있음을 알았습니다. 유효성 검사기를 즐겁게하기 위해 수정 된 버전 : jsbin.com/uqoku/2/edit
Matchu

1
@Matchu 나는 같은 문제를 겪고 .hasClass()있었지만 솔루션은 트릭을 수행 한 것 같습니다.
Nasir

11
이것은 나를 위해 작동 $('element').is('.class1.class2')하지 않았지만
chrischriswick

6
@iamchriswick : OP가 요청한 것과 약간 다릅니다. .class1.class2이 요소와 일치합니다 모두 수업을하지만, 그들은 일치하는 요소를 찾고 있던 클래스를.
Matchu

291
element.is('.class1, .class2')

작동 하지만, 그건 35 % 느린 것보다

element.hasClass('class1') || element.hasClass('class2')

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

내가 무슨 말을하는지 의심한다면 jsperf.com에서 확인할 수 있습니다 .

이것이 누군가를 돕기를 바랍니다.


16
19 % 더 느리게 처리됩니다. 프로그래머는 더 비싸다.
Nowaker

21
@DamianNowak 만약 그 프로그래머들이 사소한 양의 더 많은 코드를 작성하려고하지 않는다면 아마도 비싸지 않을 것입니다.
Akkuma

2
... 음, 방금 Chrome 21.0.1180의 jsperf에서 이것을 실행했으며 is () 메소드가 약 20 % 빠릅니다. 그러나 hasClass ()가 더 읽기 쉽습니다.
Danyal Aytekin

3
@psychobrm : 한 번에 10 개의 수업을 확인해야하는 경우, 실제로 필요한 것은 수업 이름을 간소화하는 것입니다. 그런 말도 안될 이유가 없습니다. :)
cHao

5
개인적으로 성능 최적화의 필요성을 알 수 없습니다. 초당 12000 작업은 충분히 빠릅니다. 나는 당신에게 더 멋진 것을 사용한다고 말하고 싶습니다. 필요할 때 성능을 최적화하십시오.
3Dom

38
$.fn.extend({
    hasClasses: function (selectors) {
        var self = this;
        for (var i in selectors) {
            if ($(self).hasClass(selectors[i])) 
                return true;
        }
        return false;
    }
});

$('#element').hasClasses(['class1', 'class2', 'class3']);

간단하고 쉬운 방법입니다.


2
for (i에서 선택기)에 var가 없으므로 전역을 만듭니다.
gremwell

4
사소한 점이지만 매개 변수 선택기 는 실제로 이름이 class 또는 classNames 이어야합니다 . 선택기가 아닌 전달하는 것이기 때문입니다. 선택기 앞에 $ ( '# element'). hasClasses ([ '. class1', '.class2', '.class3'])와 같이 점이 표시됩니다.
jbyrd

10

filter () 는 다른 옵션입니다

일치하는 요소 세트를 선택기와 일치하는 요소로 줄이거 나 함수의 테스트를 통과하십시오.

$(selector).filter('.class1, .class2'); //Filter elements: class1 OR class2

$(selector).filter('.class1.class2'); // Filter elements: class1 AND class2


4

다음은 구문을 따르는 답변입니다.

$(element).hasAnyOfClasses("class1","class2","class3")
(function($){
    $.fn.hasAnyOfClasses = function(){
        for(var i= 0, il=arguments.length; i<il; i++){
            if($self.hasClass(arguments[i])) return true;
        }
        return false;
    }
})(jQuery);

가장 빠르지는 않지만 모호하지 않은 솔루션을 선호합니다. 벤치 : http://jsperf.com/hasclasstest/10


Error: $self is not defined
bagofmilk

1
@bagofmilk 6 년 전에 작성한 이후로 내 답변이 다른 사람에 의해 편집되었습니다. 몇 년 동안 jQuery를 사용하지 않았기 때문에 편집 내용이 무엇인지 정확히 알지 못했지만 원래 var $self = $(this);for-loop 직전에 있던
Henrik Myntti

1

이건 어때?

$.fn.extend({
     hasClasses: function( selector ) {
        var classNamesRegex = new RegExp("( " + selector.replace(/ +/g,"").replace(/,/g, " | ") + " )"),
            rclass = /[\n\t\r]/g,
            i = 0,
            l = this.length;
        for ( ; i < l; i++ ) {
            if ( this[i].nodeType === 1 && classNamesRegex.test((" " + this[i].className + " ").replace(rclass, " "))) {
                return true;
            }
        }
        return false;
    }
});

사용하기 쉬운,

if ( $("selector").hasClasses("class1, class2, class3") ) {
  //Yes It does
}

그리고 더 빠른 것 같습니다, http://jsperf.com/hasclasstest/7


1

이건 어떤가요:

if($('.class.class2.class3').length > 0){
    //...
}

3
필요하지 않습니다 > 0. 길이가 0이 아닌 경우 true를 리턴합니다.
Isaac Lubow

1

jQuery

if( ['class', 'class2'].some(c => [...element[0].classList].includes(c)) )

바닐라 JS

if( ['class', 'class2'].some(c => [...element.classList].includes(c)) )

0

기본 js match () 함수를 사용하십시오.

if( element.attr('class') !== undefined && element.attr('class').match(/class1|class2|class3|class4|class5/) ) {
  console.log("match");
}

regexp에서 변수를 사용하려면 다음을 사용하십시오.

var reg = new RegExp(variable, 'g');
$(this).match(reg);

그건 그렇고, 이것은 가장 빠른 방법입니다 : http://jsperf.com/hasclass-vs-is-stackoverflow/22


이 답변과 마찬가지로, 클래스를 반복하고 문자열 indexOf 테스트를 사용하는 것이 훨씬 더 빠를 것으로 생각되지만 ...
terraling

0

나를 위해 작동 :

 if ( $("element").hasClass( "class1") || $("element").hasClass("class2") ) {

 //do something here

 }

0

이 방법으로 할 수 있습니다 :

if($(selector).filter('.class1, .class2').length){
    // Or logic
}

if($(selector).filter('.class1, .class2').length){
    // And logic
}

-1

이것은 나를 위해 일했다 :

$('.class1[class~="class2"]').append('something');

3
이 답변은 질문과 관련이 없습니다.
Jezen Thomas

이것은 실제로 큰 대답입니다. 위의 선택기 구문은 모든 요소를 ​​class1 및 class2로 가져옵니다. 그런 다음 원하는대로 할 수 있습니다 (이 경우 추가). 다른 방법과 비교하여 성능을 확인하지는 않았지만 구문은 간결하고 간결합니다.
팀 라이트

2
@TimWright 이것은 끔찍한 대답입니다. 클래스가 2 개인 요소를 선택하는 일반적인 방법 $('.class1.class2')은 두 번째 클래스에 속성 선택기를 사용할 필요가 없습니다. 또한 문제는 모든 클래스가 아닌 어떤 클래스로든 요소를 ​​선택하는 방법을 묻는 것입니다.
모든 근로자가 필수적
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.