jQuery hasClass () - controlla più di una classe


162

Con:

if(element.hasClass("class"))

Posso verificare una classe, ma esiste un modo semplice per verificare se "element" ha una o più classi?

Sto usando:

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

Il che non è male, ma sto pensando a qualcosa del tipo:

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

Che purtroppo non funziona.

C'è qualcosa del genere?

Risposte:


228

Che ne dite di:

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

9
No, perché cercherebbe elementi che hanno entrambe le classi. Penso che Marcel stia cercando elementi con una o più di una serie di classi.
Giles Van Gruisen,

Proprio ora ho notato che ho 4 elementi id = "ciao" lì. Versione corretta per rendere felici i validatori: jsbin.com/uqoku/2/edit
Matchu

1
@Matchu Avevo lo stesso problema, .hasClass()ma la tua soluzione sembra aver risolto il problema , grazie
Nasir

11
Questo non ha funzionato per me, ma $('element').is('.class1.class2')ha funzionato
iamchriswick il

6
@iamchriswick: è leggermente diverso da quello che OP stava chiedendo. .class1.class2corrisponderanno a elementi che hanno entrambe le classi, ma stavano cercando elementi che corrispondono a entrambe le classi.
Matchu,

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

funziona, ma è più lento del 35% rispetto a

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

inserisci qui la descrizione dell'immagine

Se dubiti di ciò che dico, puoi verificare su jsperf.com .

Spero che questo aiuti qualcuno.


16
19% più lento, grosso problema. I programmatori sono più costosi.
Nowaker,

21
@DamianNowak se quei programmatori non sono disposti a scrivere ciò che equivale a una quantità banale di più codice, probabilmente non sono molto costosi.
Akkuma,

2
... um, ma l'ho appena eseguito in jsperf per Chrome 21.0.1180 e il metodo is () ora è circa il 20% più veloce. Ma hasClass () sembra più leggibile.
Danyal Aytekin,

3
@psychobrm: se devi controllare 10 classi contemporaneamente, ciò di cui hai veramente bisogno è semplificare i nomi delle tue classi. Non c'è motivo per tali sciocchezze. :)
cHao,

5
Personalmente non vedo la necessità di ottimizzare le prestazioni. 12000 operazioni al secondo mi sembrano abbastanza veloci. Direi che usa quello che ti sembra più bello. Ottimizza le prestazioni in caso di necessità.
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']);

Questo dovrebbe farlo, semplice e facile.


2
Manca un var nel for (i nei selettori), creando così un globale.
Gremwell,

4
Un po 'un punto secondario, ma i selettori di parametri dovrebbero davvero essere chiamati classi o classNames , poiché è quello che stai passando, non i selettori. I selettori avrebbero un punto davanti, come in $ ('# element'). HasClasses (['. Class1', '.class2', '.class3']);
jbyrd,

10

filter () è un'altra opzione

Ridurre il set di elementi corrispondenti a quelli corrispondenti al selettore o superare il test della funzione.

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

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


4

ecco una risposta che segue la sintassi di

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

non è il più veloce, ma è inequivocabile e la soluzione che preferisco. panchina: http://jsperf.com/hasclasstest/10


Error: $self is not defined
Bagofmilk

1
@bagofmilk La mia risposta è stata modificata da altri da quando l'ho scritta 6 anni fa. Dal momento che non uso jQuery da anni, non so esattamente cosa fosse previsto con la modifica, ma originariamente avevo var $self = $(this);appena prima del for-loop
Henrik Myntti

1

Che dire di questo,

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

Facile da usare,

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

E sembra essere più veloce, http://jsperf.com/hasclasstest/7


1

Che dire:

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

3
Non hai bisogno del > 0. Se la lunghezza è diversa da zero, verrà restituito true.
Isaac Lubow,

1

jQuery

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

Vanilla JS

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

0

usa la funzione js match () predefinita:

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

per usare le variabili in regexp, usa questo:

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

a proposito, questo è il modo più veloce: http://jsperf.com/hasclass-vs-is-stackoverflow/22


Ti piace questa risposta migliore, anche se ho il sospetto che scorrendo le classi e utilizzando una stringa indexOf di prova potrebbe essere ancora più veloce ancora ...
terraling

0

Per me va bene:

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

 //do something here

 }

0

Puoi fare così:

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

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

-1

Questo ha funzionato per me:

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

3
Questa risposta non ha nulla a che fare con la domanda posta.
Jezen Thomas,

Questa è in realtà un'ottima risposta. La sintassi del selettore sopra riportata prende tutti gli elementi sia con class1 che class2. Quindi puoi fare quello che ti piace, in questo caso aggiungere. Non ho verificato le prestazioni rispetto ad altri metodi, ma la sintassi è piacevole e concisa.
Tim Wright,

2
@TimWright Questa è una risposta terribile. Il modo normale di selezionare un elemento con 2 classi $('.class1.class2')non è necessario utilizzare un selettore di attributi per la seconda classe. Inoltre, la domanda è: come selezionare un elemento da una di una qualsiasi, non tutte le classi.
Tutti i lavoratori sono essenziali
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.