jQuery hasClass () - kiểm tra nhiều hơn một lớp


162

Với:

if(element.hasClass("class"))

Tôi có thể kiểm tra một lớp, nhưng có cách nào dễ dàng để kiểm tra xem "phần tử" có bất kỳ lớp nào không?

Tôi đang dùng:

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

Điều đó không quá tệ, nhưng tôi đang nghĩ về một cái gì đó như:

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

Thật không may, không làm việc.

Có một cái gì đó như thế?

Câu trả lời:


227

Làm thế nào về:

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

9
Không, bởi vì điều đó sẽ tìm kiếm các phần tử có cả hai lớp. Tôi nghĩ Marcel đang tìm kiếm các yếu tố với một hoặc nhiều lớp học.
Giles Van Gruisen

Bây giờ nhận thấy rằng tôi có 4 yếu tố id = "xin chào" ở đó. Đã sửa phiên bản để làm cho trình xác nhận hài lòng: jsbin.com/uqoku/2/edit
Matchu

1
@Matchu Tôi gặp vấn đề tương tự .hasClass()nhưng giải pháp của bạn dường như đã thực hiện được mánh khóe, cảm ơn
Nasir

11
Điều này không làm việc cho tôi, nhưng $('element').is('.class1.class2')đã làm
iamchriswick 17/03/2016

6
@iamchriswick: Điều đó hơi khác so với những gì OP yêu cầu. .class1.class2sẽ khớp với các phần tử có cả hai lớp, nhưng chúng tìm kiếm các phần tử khớp với cả hai lớp.
Matchu 18/03/2016

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

hoạt động, nhưngchậm hơn 35% so với

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

nhập mô tả hình ảnh ở đây

Nếu bạn nghi ngờ những gì tôi nói, bạn có thể xác minh trên jsperf.com .

Hy vọng điều này sẽ giúp ai đó.


16
Chậm hơn 19%, thỏa thuận lớn. Lập trình viên đắt hơn.
Bây giờ là

21
@DamianNowak nếu những lập trình viên đó không sẵn sàng viết số tiền với số lượng mã không đáng kể thì họ có thể không phải là những người rất đắt tiền.
Akkuma

2
... Ừm, nhưng tôi chỉ chạy cái này trong jsperf cho Chrome 21.0.1180 và phương thức is () bây giờ nhanh hơn khoảng 20%. Nhưng hasClass () có vẻ dễ đọc hơn.
Danyal Aytekin

3
@psychobrm: Nếu bạn phải kiểm tra 10 lớp cùng một lúc, điều bạn thực sự cần là hợp lý hóa tên lớp của bạn. Không có lý do cho những điều vô nghĩa như vậy. :)
cHao

5
Cá nhân không thể thấy sự cần thiết để tối ưu hóa hiệu suất. 12000 hoạt động mỗi giây dường như đủ nhanh với tôi. Tôi muốn sử dụng bất cứ thứ gì trông đẹp hơn đối với bạn. Tối ưu hóa hiệu suất khi có nhu cầu.
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']);

Điều này nên làm điều đó, đơn giản và dễ dàng.


2
Bạn đang thiếu một var trong for (i trong bộ chọn), do đó tạo ra một toàn cục.
gremwell

4
Một chút điểm nhỏ, nhưng các bộ chọn tham số thực sự nên được đặt tên là class hoặc classNames , vì đó là những gì bạn đang truyền vào, không phải là bộ chọn. Các bộ chọn sẽ có một dấu chấm ở phía trước chúng, như trong $ ('# phần tử'). HasClass (['. Class1', '. Class2', '. Class3']);
jbyrd

10

bộ lọc () là một tùy chọn khác

Giảm tập hợp các phần tử khớp với các phần tử khớp với bộ chọn hoặc vượt qua bài kiểm tra của hàm.

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

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


4

đây là một câu trả lời theo cú pháp của

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

nó không phải là nhanh nhất, nhưng nó rõ ràng và là giải pháp tôi thích. băng ghế dự bị: http://jsperf.com/hasclasstest/10


Error: $self is not defined
bagofmilk

1
@bagofmilk Câu trả lời của tôi đã được chỉnh sửa bởi những người khác kể từ khi tôi viết nó 6 năm trước. Vì tôi đã không sử dụng jQuery trong nhiều năm, tôi không biết chính xác những gì được dự định với bản chỉnh sửa nhưng ban đầu tôi đã có var $self = $(this);trước vòng lặp for
Henrik Myntti

1

Cái này thì sao,

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

Dễ sử dụng,

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

Và nó dường như nhanh hơn, http://jsperf.com/hasclasstest/7


1

Thế còn:

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

3
Bạn không cần > 0. Nếu độ dài khác không, nó sẽ trả về 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

sử dụng hàm js match () mặc định:

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

để sử dụng các biến trong regrec, hãy sử dụng:

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

Nhân tiện, đây là cách nhanh nhất: http://jsperf.com/hasgroup-vs-is-stackoverflow/22


Giống như câu trả lời này tốt nhất, mặc dù tôi nghi ngờ rằng việc lặp qua các lớp và sử dụng kiểm tra indexOf chuỗi có thể còn nhanh hơn nữa ...
chia sẻ

0

Làm việc cho tôi:

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

 //do something here

 }

0

Bạn có thể làm theo cách này:

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

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

-1

Điều này làm việc cho tôi:

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

3
Câu trả lời này không có gì để làm với câu hỏi.
Jezen Thomas

Đây thực sự là một câu trả lời tuyệt vời. Cú pháp bộ chọn ở trên lấy tất cả các phần tử với cả class1 và class2. Sau đó, bạn có thể làm những gì bạn thích với nó, trong trường hợp này nối thêm. Không kiểm tra hiệu năng so với các phương pháp khác nhưng cú pháp rất hay và cô đọng.
Tim Wright

2
@TimWright Đây là một câu trả lời khủng khiếp. Cách thông thường để chọn một phần tử có 2 lớp là $('.class1.class2')không cần sử dụng bộ chọn thuộc tính cho lớp thứ hai. Ngoài ra, câu hỏi là hỏi làm thế nào để chọn một phần tử bởi một trong bất kỳ, không phải tất cả các lớp.
Tất cả công nhân đều cần thiết vào
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.