jQuery hasClass () - ตรวจสอบมากกว่าหนึ่งคลาส


162

ด้วย:

if(element.hasClass("class"))

ฉันสามารถตรวจสอบชั้นหนึ่ง แต่มีวิธีที่ง่ายในการตรวจสอบว่า "องค์ประกอบ" มีหลายชั้นหรือไม่?

ฉันใช้:

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

ซึ่งไม่ได้เลวร้ายเกินไป แต่ฉันคิดว่าบางสิ่งเช่น:

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

ซึ่งน่าเสียดายที่มันไม่ทำงาน

มีอะไรแบบนั้นเหรอ?

คำตอบ:


227

เกี่ยวกับ:

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

9
ไม่เพราะนั่นจะมองหาองค์ประกอบที่มีทั้งสองคลาส ฉันคิดว่า Marcel กำลังมองหาองค์ประกอบที่มีคลาสอย่างน้อยหนึ่งคลาส
Giles Van Gruisen

เพิ่งสังเกตเห็นว่าฉันมีองค์ประกอบ 4 id = "hello" ที่นั่น รุ่นที่แก้ไขเพื่อให้ผู้ตรวจสอบมีความสุข: jsbin.com/uqoku/2/edit
Matchu

1
@Matchu ฉันมีปัญหาเดียวกันกับ.hasClass()แต่วิธีการแก้ปัญหาของคุณดูเหมือนว่าจะได้ทำเคล็ดลับขอบคุณ
Nasir

11
สิ่งนี้ไม่ได้ผลสำหรับฉัน แต่$('element').is('.class1.class2')ทำได้
iamchriswick

6
@iamchriswick: มันแตกต่างจากสิ่งที่ OP ต้องการเล็กน้อย .class1.class2จะจับคู่องค์ประกอบที่มีทั้งสองคลาส แต่พวกเขากำลังมองหาองค์ประกอบที่ตรงกับทั้งสองคลาส
Matchu

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

ทำงานแต่มันเป็น35% ช้ากว่า

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

ป้อนคำอธิบายรูปภาพที่นี่

หากคุณสงสัยในสิ่งที่ฉันพูดคุณสามารถยืนยันบนjsperf.com jsperf.com

หวังว่าจะช่วยคนได้


16
ช้าลง 19% เรื่องใหญ่ โปรแกรมเมอร์มีราคาแพงกว่า
Nowaker

21
@DamianNow ถ้าโปรแกรมเมอร์เหล่านั้นไม่เต็มใจที่จะเขียนว่าอะไรเป็นจำนวนรหัสเพิ่มเติมเล็กน้อยที่พวกเขาอาจจะไม่แพงมาก
Akkuma

2
... อืม แต่ฉันเพิ่งใช้งานใน jsperf สำหรับ Chrome 21.0.1180 และวิธี is () ตอนนี้เร็วขึ้นประมาณ 20% แต่ดูเหมือนว่า hasClass () จะอ่านได้มากกว่า
Danyal Aytekin

3
@psychobrm: ถ้าคุณต้องตรวจสอบ 10 คลาสพร้อมกันสิ่งที่คุณต้องการจริงๆคือการทำให้ชื่อคลาสของคุณคล่องตัวขึ้น ไม่มีเหตุผลที่ไร้สาระเช่นนั้น :)
cHao

5
โดยส่วนตัวไม่เห็นความจำเป็นในการเพิ่มประสิทธิภาพ การดำเนินการ 12,000 ต่อวินาทีดูเหมือนว่าเร็วพอสำหรับฉัน ฉันว่าจะใช้รูปไหนที่ดีกว่าสำหรับคุณ ปรับปรุงประสิทธิภาพเมื่อจำเป็นที่จะต้องเกิดขึ้น
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']);

สิ่งนี้ควรทำง่ายและสะดวก


2
คุณไม่มี var ในเครื่องหมายสำหรับ (i in selectors) ดังนั้นการสร้างแบบทั่วโลก
gremwell

4
เป็นจุดเล็กน้อย แต่ตัวเลือกพารามิเตอร์ควรตั้งชื่อคลาสหรือคลาสเนมเนื่องจากเป็นสิ่งที่คุณส่งผ่านไม่ใช่ตัวเลือก ตัวเลือกจะมีจุดอยู่ข้างหน้าเช่นใน $ ('# element'). hasClasses (['. class1', '.class2', '.class3']);
jbyrd

10

ตัวกรอง ()เป็นตัวเลือกอื่น

ลดชุดขององค์ประกอบที่ตรงกันให้ตรงกับตัวเลือกหรือผ่านการทดสอบการทำงานของ

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

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


4

นี่คือคำตอบที่ไม่เป็นไปตามไวยากรณ์ของ

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

มันไม่ใช่วิธีที่เร็วที่สุด แต่ก็ไม่ได้คลุมเครือและเป็นทางออกที่ฉันต้องการ bench: http://jsperf.com/hasclasstest/10


Error: $self is not defined
bagofmilk

1
@bagofmilk คำตอบของฉันถูกแก้ไขโดยผู้อื่นตั้งแต่ฉันเขียนเมื่อ 6 ปีที่แล้ว เนื่องจากฉันไม่ได้ใช้ jQuery เป็นเวลาหลายปีฉันไม่ทราบแน่ชัดว่ามีจุดประสงค์อะไรในการแก้ไข แต่เดิมฉันมีvar $self = $(this);ก่อนการวนรอบ
Henrik Myntti

1

เกี่ยวกับสิ่งนี้

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


1

เกี่ยวกับ:

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

3
> 0คุณไม่จำเป็นต้อง ถ้าความยาวไม่ใช่ศูนย์มันจะคืนค่าจริง
Isaac Lubow

1

jQuery

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

วานิลลา JS

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

0

ใช้ฟังก์ชัน js match () เริ่มต้น:

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

เพื่อใช้ตัวแปรใน regexp ใช้สิ่งนี้:

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

โดยวิธีนี้เป็นวิธีที่เร็วที่สุด: http://jsperf.com/hasclass-vs-is-stackoverflow/22


ชอบคำตอบนี้ดีที่สุด แต่ผมสงสัยว่าบ่วงผ่านชั้นเรียนและการใช้สตริง indexOf ทดสอบอาจจะยังคงทำงานได้เร็วขึ้น ...
terraling


0

คุณสามารถทำสิ่งนี้ได้:

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

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

-1

สิ่งนี้ใช้ได้กับฉัน:

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

3
คำตอบนี้ไม่เกี่ยวข้องกับคำถามที่ถาม
Jezen Thomas

นี่เป็นคำตอบที่ดีจริงๆ ไวยากรณ์ตัวเลือกด้านบนจับองค์ประกอบทั้งหมดที่มีทั้ง class1 และ class2 จากนั้นคุณสามารถทำสิ่งที่คุณชอบในกรณีนี้ผนวก ยังไม่ได้ตรวจสอบประสิทธิภาพเปรียบเทียบกับวิธีอื่น ๆ แต่ไวยากรณ์ดีและกระชับ
ทิมไรท์

2
@ TimWright นี่เป็นคำตอบที่แย่มาก วิธีปกติในการเลือกองค์ประกอบที่มี 2 คลาสคือ$('.class1.class2')ไม่จำเป็นต้องใช้ตัวเลือกคุณลักษณะสำหรับคลาสที่สอง คำถามก็ถามว่าจะเลือกองค์ประกอบโดยหนึ่งในใด ๆ ไม่ได้ทุกชั้นเรียน
คนงานทุกคนมีความจำเป็น
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.