jQuery hasClass () - sprawdź więcej niż jedną klasę

162

Z:

if(element.hasClass("class"))

Mogę sprawdzić jedną klasę, ale czy istnieje łatwy sposób sprawdzenia, czy „element” ma jedną z wielu klas?

Ja używam:

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

Co nie jest takie złe, ale myślę o czymś takim:

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

Co niestety nie działa.

Czy jest coś takiego?

Hans
źródło

Odpowiedzi:

227

Co powiesz na:

element.is('.class1, .class2')
Matchu
źródło
9
Nie, ponieważ to szukałoby elementów, które mają obie klasy. Myślę, że Marcel szuka elementów z jedną lub kilkoma klasami.
Giles Van Gruisen
Właśnie zauważyłem, że mam tam 4 elementy id = "hello". Poprawiona wersja w celu uszczęśliwienia walidatorów: jsbin.com/uqoku/2/edit
Matchu
1
@Matchu Miałem ten sam problem, .hasClass()ale wydaje się, że twoje rozwiązanie załatwiło sprawę , dzięki
Nasir.
11
To nie dla mnie, ale $('element').is('.class1.class2')nie
iamchriswick
6
@iamchriswick: To trochę różni się od tego, o co prosił OP. .class1.class2dopasuje elementy, które mają obie klasy, ale szukały elementów pasujących do którejkolwiek z klas.
Matchu
291
element.is('.class1, .class2')

działa, ale jest o 35% wolniejszy niż

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

wprowadź opis obrazu tutaj

Jeśli wątpisz w to, co mówię, możesz to zweryfikować jsperf.com .

Mam nadzieję, że to komuś pomoże.

Simon Arnold
źródło
16
19% wolniej, wielka sprawa. Programiści są drożsi.
Nowaker
21
@DamianNowak, jeśli ci programiści nie są skłonni napisać trywialnej ilości więcej kodu, prawdopodobnie nie są to bardzo drogie.
Akkuma
2
... um, ale właśnie uruchomiłem to w jsperf dla Chrome 21.0.1180, a metoda is () jest teraz około 20% szybsza. Ale hasClass () wydaje się bardziej czytelny.
Danyal Aytekin
3
@psychobrm: Jeśli musisz sprawdzić 10 klas naraz, to naprawdę potrzebujesz usprawnić nazwy swoich klas. Nie ma powodu do takich bzdur. :)
cHao
5
Osobiście nie widzę potrzeby optymalizacji wydajności. 12000 operacji na sekundę wydaje mi się wystarczająco szybkie. Powiedziałbym, że użyj tego, który wygląda ładniej. Optymalizuj wydajność, gdy zajdzie taka potrzeba.
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']);

Powinno to zrobić, proste i łatwe.

Kalel Wade
źródło
2
Brakuje var w for (i w selektorach), tworząc w ten sposób globalny.
gremwell
4
Trochę punktu moll, ale parametr selektorów powinien być naprawdę o nazwie klasy lub classnames , ponieważ to, co masz w przejściu nie selektorów. Selektory miałyby przed sobą kropkę, jak w $ ('# element'). HasClasses (['. Class1', '.class2', '.class3']);
jbyrd
10

filter () to kolejna opcja

Zmniejsz zestaw dopasowanych elementów do tych, które pasują do selektora lub przeprowadź test funkcji.

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

$(selector).filter('.class1.class2'); // Filter elements: class1 AND class2
John Magnolia
źródło
6

Co powiesz na to?

if (element.hasClass("class1 class2")
Robert Łoziński
źródło
3
To nie działa, jeśli patrzysz na stan LUB.
Jason Conville
4

oto odpowiedź zgodna ze składnią

$(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);

nie jest to najszybsze, ale jest jednoznaczne i preferowane przeze mnie rozwiązanie. ławka: http://jsperf.com/hasclasstest/10

Henrik Myntti
źródło
Error: $self is not defined
bagofmilk
1
@bagofmilk Moja odpowiedź była edytowana przez innych odkąd napisałem ją 6 lat temu. Ponieważ nie korzystałem z jQuery od lat, nie wiem dokładnie, co było zamierzone w edycji, ale pierwotnie miałem var $self = $(this);tuż przed pętlą for
Henrik Myntti
1

A co z tym,

$.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;
    }
});

Łatwy w użyciu,

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

Wydaje się, że działa szybciej, http://jsperf.com/hasclasstest/7

Okan Kocyigit
źródło
1

Co powiesz na:

if($('.class.class2.class3').length > 0){
    //...
}
u01jmg3
źródło
3
Nie potrzebujesz > 0. Jeśli długość jest różna od zera, zwróci true.
Izaak Lubow
1

jQuery

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

Vanilla JS

if( ['class', 'class2'].some(c => [...element.classList].includes(c)) )
Simon Arnold
źródło
0

użyj domyślnej funkcji match () js:

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

aby użyć zmiennych w wyrażeniu regularnym, użyj tego:

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

tak przy okazji, to najszybszy sposób: http://jsperf.com/hasclass-vs-is-stackoverflow/22

Romualds Cirsis
źródło
Podoba mi się ta odpowiedź, chociaż podejrzewam, że pętla po klasach i użycie testu string indexOf może być jeszcze szybsze ...
przerażające
0

Pracuje dla mnie:

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

 //do something here

 }
Rangel R. Morais
źródło
0

Możesz to zrobić w ten sposób:

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

if($(selector).filter('.class1, .class2').length){
    // And logic
}
Hamidreza
źródło
-1

To zadziałało dla mnie:

$('.class1[class~="class2"]').append('something');
Tina
źródło
3
Ta odpowiedź nie ma nic wspólnego z zadanym pytaniem.
Jezen Thomas
To naprawdę świetna odpowiedź. Powyższa składnia selektora przechwytuje wszystkie elementy z klasami class1 i class2. Następnie możesz z nim robić, co chcesz, w tym przypadku dołącz. Nie sprawdzałem wydajności w porównaniu z innymi metodami, ale składnia jest ładna i zwięzła.
Tim Wright,
2
@TimWright To okropna odpowiedź. Normalnym sposobem wybrania elementu z 2 klasami jest $('.class1.class2')brak konieczności używania selektora atrybutu dla drugiej klasy. Powstaje również pytanie, jak wybrać element według jednej z dowolnych, nie wszystkich klas.
Wszyscy pracownicy są niezbędni