jQuery hasClass () - birden fazla sınıf olup olmadığını kontrol edin


162

İle:

if(element.hasClass("class"))

Bir sınıfı kontrol edebilirim, ama "element" in herhangi bir sınıf olup olmadığını kontrol etmenin kolay bir yolu var mı?

Ben kullanıyorum:

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

Bu çok kötü değil, ama şöyle bir şey düşünüyorum:

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

Hangi maalesef çalışmıyor.

Böyle bir şey var mı?

Yanıtlar:


227

Nasıl olur:

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

9
Hayır, çünkü bu her iki sınıfa da sahip öğeleri arayacaktır. Bence Marcel bir ya da daha fazla sınıfa sahip elemanlar arıyor.
Giles Van Gruisen

Sadece şimdi orada 4 id = "merhaba" öğeleri olduğunu fark ettim. Doğrulayıcıları mutlu etmek için sabit sürüm: jsbin.com/uqoku/2/edit
Matchu

1
@Matchu Ben de aynı sorunu yaşıyordum .hasClass()ama çözüm hile yapmış gibi görünüyor, teşekkürler
Nasir

11
Bu benim için işe yaramadı, ama işe $('element').is('.class1.class2')yaramadı
iamchriswick

6
@iamchriswick: Bu OP'nin istediklerinden biraz farklı. .class1.class2sahip elemanlar maç olacak hem sınıfları ama uyuşmaz elemanlar aradığını ya sınıfı.
Mart'ta Matchu

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

çalışır, ancak bu kadar % 35 daha yavaş daha

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

resim açıklamasını buraya girin

Söylediklerimden şüphe ediyorsanız jsperf.com'da doğrulayabilirsiniz .

Umarım bu birine yardım eder.


16
% 19 daha yavaş, önemli. Programcılar daha pahalıdır.
Nowaker

21
@DamianNowak, eğer bu programcılar önemsiz miktarda daha fazla kodun ne olduğunu yazmaya istekli değilse, muhtemelen çok pahalı olmayan kodlardır.
Akkuma

2
... hm, ancak bunu Chrome 21.0.1180 için jsperf'de çalıştırdım ve is () yöntemi şimdi yaklaşık% 20 daha hızlı. Ancak hasClass () daha okunabilir görünüyor.
Danyal Aytekin

3
@psychobrm: Aynı anda 10 sınıfı kontrol etmeniz gerekiyorsa, gerçekten ihtiyacınız olan şey sınıf adlarınızı düzene koymaktır. Böyle saçmalıklara gerek yok. :)
cHao

5
Şahsen performans optimizasyonu ihtiyacını göremiyorum. Saniyede 12000 işlem benim için yeterince hızlı görünüyor. Sana hangisi daha güzel görünüyorsa onu kullan diyebilirim. İhtiyaç duyulduğunda performansı optimize edin.
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']);

Bunu basit ve kolay yapmalı.


2
For (i seçicilerinde) içinde bir değişken eksiksiniz, böylece bir global yaratırsınız.
gremwell

4
Biraz küçük bir nokta, ancak parametre seçicileri gerçekten sınıflar veya classNames olarak adlandırılmalıdır , çünkü seçiciler değil, içinden geçtiğiniz şey budur. Seçicilerin önünde $ ('# element') gibi bir nokta bulunur. HasClasses (['. Class1', '.class2', '.class3']);
jbyrd

10

filter () başka bir seçenektir

Eşleşen öğeler kümesini seçiciyle eşleşen veya işlevin sınamasını geçenlerle azaltın.

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

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


4

İşte sözdizimini takip eden bir cevap

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

en hızlı değil, ama açık ve tercih ettiğim çözüm. tezgah: http://jsperf.com/hasclasstest/10


Error: $self is not defined
bagofmilk

1
@bagofmilk 6 yıl önce yazdığımdan beri cevabım başkaları tarafından düzenlendi. Yıllar boyunca jQuery kullanmadığım için, düzenleme ile neyin amaçlandığını tam olarak bilmiyorum ama başlangıçta var $self = $(this);for-
loop'tan

1

Peki buna ne dersin,

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

Kullanımı kolay,

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

Ve daha hızlı görünüyor, http://jsperf.com/hasclasstest/7


1

Ne dersin:

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

3
İhtiyacınız yok > 0. Uzunluk sıfırdan farklıysa true değerini döndürür.
Isaac Lubow

1

jQuery

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

Vanilya JS

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

0

varsayılan js match () işlevini kullan:

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

regexp'de değişkenleri kullanmak için şunu kullanın:

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

bu arada, bu en hızlı yoldur: http://jsperf.com/hasclass-vs-is-stackoverflow/22


Sınıflar arasında döngü ve bir string indexOf testi kullanarak şüpheli rağmen en iyi bu cevap gibi, hala daha hızlı olabilir ...
terraling

0

Benim için çalışıyor:

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

 //do something here

 }

0

Bu şekilde yapabilirsiniz:

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

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

-1

Bu benim için çalıştı:

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

3
Bu cevabın, sorulan soru ile ilgisi yoktur.
Jezen Thomas

Bu aslında harika bir cevap. Yukarıdaki seçici sözdizimi hem class1 hem de class2 ile tüm öğeleri yakalar. O zaman onunla ne istersen yapabilirsin, bu durumda ekle. Performansı diğer yöntemlere kıyasla kontrol etmedim ancak sözdizimi güzel ve özlü.
Tim Wright

2
@TimWright Bu korkunç bir cevap. 2 sınıflı bir eleman seçmenin normal yolu $('.class1.class2'), ikinci sınıf için bir öznitelik seçici kullanmaya gerek yoktur. Ayrıca, soru, bir öğenin tüm sınıflardan değil, herhangi birinden nasıl seçileceğini sormaktır.
Tüm İşçiler
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.