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?

Hans
sumber

Jawaban:

227

Bagaimana tentang:

element.is('.class1, .class2')
Matchu
sumber
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.

Simon Arnold
sumber
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.

Kalel Wade
sumber
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
John Magnolia
sumber
6

Bagaimana dengan ini?

if (element.hasClass("class1 class2")
Robert Łoziński
sumber
3
Ini tidak berfungsi jika Anda melihat kondisi ATAU.
Jason Conville
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

Henrik Myntti
sumber
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

Okan Kocyigit
sumber
1

Bagaimana dengan:

if($('.class.class2.class3').length > 0){
    //...
}
u01jmg3
sumber
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)) )
Simon Arnold
sumber
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

Romualds Cirsis
sumber
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

 }
Rangel R. Morais
sumber
0

Anda bisa melakukan ini:

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

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

Ini bekerja untuk saya:

$('.class1[class~="class2"]').append('something');
Tina
sumber
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