jQuery hasClass () - periksa lebih dari satu kelas


162

Dengan:

if(element.hasClass("class"))

Saya dapat memeriksa satu kelas, tetapi apakah ada cara mudah untuk memeriksa apakah "elemen" memiliki salah satu dari banyak kelas?

Saya menggunakan:

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

Yang tidak terlalu buruk, tetapi saya memikirkan sesuatu seperti:

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

Yang sayangnya tidak berhasil.

Apakah ada yang seperti itu?

Jawaban:


227

Bagaimana tentang:

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

9
Tidak, karena itu akan mencari elemen yang memiliki kedua kelas. Saya pikir Marcel sedang mencari elemen dengan satu atau lebih dari sejumlah kelas.
Giles Van Gruisen

Baru saja diketahui bahwa saya memiliki 4 id = "halo" elemen di sana. Versi tetap untuk membuat validator senang: jsbin.com/uqoku/2/edit
Matchu

1
@ Matchu Saya mengalami masalah yang sama dengan .hasClass()tetapi solusi Anda tampaknya telah melakukan trik, terima kasih
Nasir

11
Ini tidak berhasil untuk saya, tetapi $('element').is('.class1.class2')berhasil
iamchriswick

6
@iamchriswick: Itu sedikit berbeda dari yang diminta OP. .class1.class2akan mencocokkan elemen yang memiliki kedua kelas, tetapi mereka mencari elemen yang cocok dengan kedua kelas.
Matchu

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

bekerja, tapi itu 35% lebih lambat dibandingkan

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

masukkan deskripsi gambar di sini

Jika Anda ragu dengan apa yang saya katakan, Anda dapat memverifikasi di jsperf.com .

Semoga ini bisa membantu seseorang.


16
19% lebih lambat, masalah besar. Programmer lebih mahal.
Sekarang,

21
@ DamianNowak jika para programmer tidak mau menulis jumlah kode sepele yang lebih banyak, mereka mungkin bukan yang sangat mahal.
Akkuma

2
... um, tapi saya baru saja menjalankan ini di jsperf untuk Chrome 21.0.1180 dan metode is () sekarang sekitar 20% lebih cepat. Tetapi hasClass () tampaknya lebih mudah dibaca.
Danyal Aytekin

3
@psychobrm: Jika Anda harus memeriksa 10 kelas sekaligus, yang benar-benar Anda butuhkan adalah merampingkan nama kelas Anda. Tidak ada alasan untuk omong kosong seperti itu. :)
cHao

5
Secara pribadi tidak dapat melihat perlunya mengoptimalkan kinerja. 12.000 operasi per detik tampaknya cukup cepat bagi saya. Saya akan mengatakan menggunakan mana yang terlihat lebih baik untuk Anda. Optimalkan kinerja saat dibutuhkan.
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']);

Ini harus dilakukan, sederhana dan mudah.


2
Anda kehilangan var di for (i in selectors), sehingga menciptakan global.
gremwell

4
Sedikit poin minor, tetapi selektor parameter harus benar-benar dinamai kelas atau classNames , karena itulah yang Anda lewati, bukan penyeleksi. Selektor akan memiliki titik di depan mereka, seperti dalam $ ('# element'). HasClasses (['. Class1', '.class2', '.class3']);
jbyrd

10

filter () adalah opsi lain

Kurangi setel elemen yang cocok menjadi elemen yang cocok dengan pemilih atau lulus uji fungsi.

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

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


4

inilah jawaban yang tidak mengikuti sintaksis

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

itu bukan yang tercepat, tetapi tidak ambigu dan solusi yang saya sukai. bangku: http://jsperf.com/hasclasstest/10


Error: $self is not defined
bagofmilk

1
@bagofmilk Balasan saya telah diedit oleh orang lain sejak saya menulisnya 6 tahun yang lalu. Karena saya belum pernah menggunakan jQuery selama bertahun-tahun, saya tidak tahu persis apa yang dimaksudkan dengan suntingan tetapi awalnya saya baru var $self = $(this);saja sebelum for-loop
Henrik Myntti

1

Bagaimana dengan ini,

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

Mudah digunakan,

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

Dan tampaknya lebih cepat, http://jsperf.com/hasclasstest/7


1

Bagaimana dengan:

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

3
Anda tidak membutuhkannya > 0. Jika panjangnya bukan nol, itu akan mengembalikan 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

gunakan fungsi default js match ():

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

untuk menggunakan variabel di regexp, gunakan ini:

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

omong-omong, ini adalah cara tercepat: http://jsperf.com/hasclass-vs-is-stackoverflow/22


Seperti jawaban ini yang terbaik, meskipun saya curiga bahwa perulangan melalui kelas-kelas dan menggunakan string indexOf test mungkin bahkan lebih cepat lagi ...
terraling

0

Bekerja untuk saya:

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

 //do something here

 }

0

Anda bisa melakukan ini:

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

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

-1

Ini bekerja untuk saya:

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

3
Jawaban ini tidak ada hubungannya dengan pertanyaan yang diajukan.
Jezen Thomas

Ini sebenarnya jawaban yang bagus. Sintaks selektor di atas mengambil semua elemen dengan class1 dan class2. Maka Anda dapat melakukan apa yang Anda suka dengannya, dalam hal ini tambahkan. Belum memeriksa kinerja dibandingkan dengan metode lain tetapi sintaksisnya bagus dan ringkas.
Tim Wright

2
@TimWright Ini jawaban yang buruk. Cara normal untuk memilih elemen dengan 2 kelas adalah $('.class1.class2')tanpa perlu menggunakan pemilih atribut untuk kelas kedua. Juga, pertanyaannya adalah bertanya bagaimana memilih elemen dengan salah satu dari apa saja, tidak semua kelas.
Semua Pekerja Sangat Penting
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.