web-dev-qa-db-fra.com

jQuery hasClass () - vérifie plus d'une classe

Avec:

if(element.hasClass("class"))

Je peux vérifier pour une classe, mais existe-t-il un moyen facile de vérifier si l'élément contient plusieurs classes?

J'utilise:

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

Ce qui n’est pas si mal, mais je pense à quelque chose comme:

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

Ce qui malheureusement ne fonctionne pas.

Est-ce qu'il y a quelque chose comme ça?

150
Hans

Que diriez-vous:

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

fonctionne, mais il est 35% plus lent que

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

enter image description here

Si vous doutez de ce que je dis, vous pouvez vérifier jsperf.com .

J'espère que cela aidera quelqu'un.

281
Simon Arnold
$.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']);

Cela devrait le faire, simple et facile.

36
Kalel Wade

filter () est une autre option

Réduisez l'ensemble d'éléments correspondants à ceux qui correspondent au sélecteur ou passez le test de la fonction.

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

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

Que dis-tu de ça?

if (element.hasClass("class1 class2")
5
Robert Łoziński

voici une réponse qui suit la syntaxe de

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

ce n'est pas le plus rapide, mais c'est sans ambiguïté et la solution que je préfère. banc: http://jsperf.com/hasclasstest/1

4
Henrik Myntti

Et ça,

$.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 à utiliser,

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

Et cela semble être plus rapide, http://jsperf.com/hasclasstest/7

1
ocanal

Qu'en est-il de:

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

Fonctionne pour moi:

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

 //do something here

 }
0
Rangel R. Morais

utilisez la fonction js match () par défaut:

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

pour utiliser des variables dans regexp, utilisez ceci:

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

à propos, c’est le moyen le plus rapide: http://jsperf.com/hasclass-vs-is-stackoverflow/22

0
Romualds Cirsis