jQuery hasClass () - проверить наличие нескольких классов - PullRequest
150 голосов
/ 07 февраля 2010

С:

if(element.hasClass("class"))

Я могу проверить один класс, но есть ли простой способ проверить, есть ли у "элемента" какой-либо из многих классов?

Я использую:

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

Что не так уж плохо, но я думаю о чем-то вроде:

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

Что, к сожалению, не работает.

Есть что-то подобное

Ответы [ 11 ]

280 голосов
/ 20 сентября 2011
element.is('.class1, .class2')

работает, , но , это 35% медленнее , чем

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

enter image description here

Если вы сомневаетесь в том, что я говорю, вы можете проверить на jsperf.com .

Надеюсь, это кому-нибудь поможет.

209 голосов
/ 07 февраля 2010

Как насчет:

element.is('.class1, .class2')
36 голосов
/ 05 ноября 2011
$.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']);

Это должно сделать это, просто и легко.

9 голосов
/ 25 января 2016

filter () - еще один вариант

Уменьшите набор совпадающих элементов до тех, которые соответствуют селектору или пройти тест функции.

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

$(selector).filter('.class1.class2'); // Filter elements: class1 AND class2
5 голосов
/ 14 октября 2016

Как насчет этого?

if (element.hasClass("class1 class2")
4 голосов
/ 29 августа 2013

вот ответ, который следует синтаксису

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

1 голос
/ 31 июля 2015

А как же:

if($('.class.class2.class3').length > 0){
    //...
}
1 голос
/ 17 мая 2013

Что насчёт этого,

$.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

0 голосов
/ 30 апреля 2019

У меня работает:

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

 //do something here

 }
0 голосов
/ 22 сентября 2014

использовать функцию js match () по умолчанию:

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

чтобы использовать переменные в регулярном выражении, используйте это:

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

кстати, это самый быстрый способ: http://jsperf.com/hasclass-vs-is-stackoverflow/22

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...