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.