Chức năng của has haslass Class với JavaScript đơn giản là gì?


313

Làm thế nào để bạn làm jQuery hasClassvới JavaScript đơn giản? Ví dụ,

<body class="foo thatClass bar">

Cách JavaScript để hỏi nếu <body>thatClass?


Tôi cho rằng bạn sẽ phải phân tích thuộc classtính (trong trường hợp nhiều lớp sẽ có nhiều tên lớp theo thứ tự ngẫu nhiên cách nhau bởi một khoảng trắng) và kiểm tra xem tên lớp của bạn có nằm trong đó không. Không quá khó khăn, nhưng vẫn bất tiện khủng khiếp nếu không vì mục đích học tập :)
Pekka

7
không biết liệu tôi có trễ bữa tiệc không nhưng một trang web tốt cung cấp các lựa chọn thay thế cho các chức năng của jQuery là youmightnotneedjquery.com
vào

Câu trả lời:


116

Bạn có thể kiểm tra xem element.classNametrận đấu /\bthatClass\b/.
\bphù hợp với một từ nghỉ.

Hoặc, bạn có thể sử dụng triển khai riêng của jQuery:

var className = " " + selector + " ";
if ( (" " + element.className + " ").replace(/[\n\t]/g, " ").indexOf(" thatClass ") > -1 ) 

Để trả lời câu hỏi chung chung hơn của bạn, bạn có thể xem mã nguồn của jQuery trên github hoặc tại nguồn hasClasscụ thể trong trình xem nguồn này .


6
+1 cho việc triển khai jQuery (vì đã tra cứu (tiếng Anh này có đúng không?) rclassThực sự là gì ;))
Felix Kling

6
Sẽ không \bkhớp với "thatClass-AnotherClass"?
Matthew Crumley

3
chỉ để hoàn thiện: rgroup trong các phiên bản gần đây là "/ [\ n \ t \ r] / g" (\ r đã thêm)
Felix Schwarz

4
@FelixSchwarz đã đúng, trong jQuery hiện tại, biểu thức chính quy đã được cập nhật /[\t\r\n\f]/g. Ngoài ra, thật tốt khi đề cập rằng /\bclass\b/có thể thất bại đối với các tên lớp có -dấu trừ (ngoài việc nó hoạt động tốt), đó là lý do tại sao việc triển khai của jQuery tốt hơn và đáng tin cậy hơn. Ví dụ: /\bbig\b/.test('big-text')trả về true thay vì false false.
Stano

996

Đơn giản chỉ cần sử dụng classList.contains():

if (document.body.classList.contains('thatClass')) {
    // do some stuff
}

Công dụng khác của classList:

document.body.classList.add('thisClass');
// $('body').addClass('thisClass');

document.body.classList.remove('thatClass');
// $('body').removeClass('thatClass');

document.body.classList.toggle('anotherClass');
// $('body').toggleClass('anotherClass');

Hỗ trợ trình duyệt:

  • Chrome 8.0
  • Firefox 3.6
  • IE 10
  • Opera 11,50
  • Safari 5.1

classList Hỗ trợ trình duyệt


5
Điều này không được hỗ trợ trong IE8 . IE8 có thể truy xuất .classListdưới dạng một chuỗi, nhưng nó sẽ không nhận ra các phương thức hiện đại hơn như.classList.contains()
iono

7
@iono Trong Element.classList mô tả thực hiện từ MDN có một shim rằng mở rộng hỗ trợ cho hành vi này để IE8 developer.mozilla.org/en-US/docs/Web/API/Element/classList
James

3
Tôi đồng ý với @AlexanderWigmore, điều này cực kỳ hữu ích và đơn giản.
Jacques Olivier

Bỏ phiếu này lên. Đây là một cách dễ dàng hơn để truy vấn các lớp
user2190488

@SLaks này nên được cập nhật để là câu trả lời được chấp nhận.
Umur Karagöz

35

Một lớp lót hiệu quả nhất

  • trả về một boolean (trái ngược với câu trả lời của Orble)
  • Không trả về dương tính giả khi tìm kiếm thisClasstrên một yếu tố có class="thisClass-suffix".
  • tương thích với mọi trình duyệt xuống ít nhất là IE6

function hasClass( target, className ) {
    return new RegExp('(\\s|^)' + className + '(\\s|$)').test(target.className);
}

28

Thuộc tính lưu trữ các lớp đang sử dụng là className.

Vì vậy, bạn có thể nói:

if (document.body.className.match(/\bmyclass\b/)) {
    ....
}

Nếu bạn muốn một vị trí chỉ cho bạn cách jQuery thực hiện mọi thứ, tôi sẽ đề xuất:

http://code.jquery.com/jquery-1.5.js


1
Thông minh. Các matchthuộc tính trở lại tiện dụng một lần nữa! Có thực sự jQuery làm một cái gì đó nhiều hơn có thể trong JavaScript?! Nếu không, jQuery chỉ là một trọng lượng không cần thiết của tốc ký.
animaacija

1
Điều này cũng phù hợp myclass-something, như \bphù hợp với dấu gạch nối.
Marc Durdin

1
@animaacija Tất cả các thư viện / plugin javascript về cơ bản là các tốc ký javascript vì chúng được xây dựng bằng javascript. Điều đó là: Tốc ký luôn luôn cần thiết. Không bao giờ phát minh lại bánh xe.
Edwin Stoteler

Đây là một giải pháp tuyệt vời!
Manuel Abascal

28

// 1. Use if for see that classes:

if (document.querySelector(".section-name").classList.contains("section-filter")) {
  alert("Grid section");
  // code...
}
<!--2. Add a class in the .html:-->

<div class="section-name section-filter">...</div>


4
@greg_d Diesel: không khuyến khích câu trả lời! Các giải pháp mới cho các vấn đề phổ biến được chào đón nhiều hơn.
raveren 10/03/2015

2
@Raveren trong khi các giải pháp mới cho các vấn đề cũ được hoan nghênh, câu trả lời cụ thể này không mang lại điều gì mới. Nó chỉ thêm tiếng ồn cho câu hỏi này.
Emile Bergeron

1
@raveren Đây không phải là một giải pháp mới, nó giống như câu trả lời này nhưng với ít thông tin hơn.
Vụ kiện của Quỹ Monica

13

Hàm hasClass:

HTMLElement.prototype.hasClass = function(cls) {
    var i;
    var classes = this.className.split(" ");
    for(i = 0; i < classes.length; i++) {
        if(classes[i] == cls) {
            return true;
        }
    }
    return false;
};

Hàm addClass:

HTMLElement.prototype.addClass = function(add) {
    if (!this.hasClass(add)){
        this.className = (this.className + " " + add).trim();
    }
};

Hàm removeClass:

HTMLElement.prototype.removeClass = function(remove) {
    var newClassName = "";
    var i;
    var classes = this.className.replace(/\s{2,}/g, ' ').split(" ");
    for(i = 0; i < classes.length; i++) {
        if(classes[i] !== remove) {
            newClassName += classes[i] + " ";
        }
    }
    this.className = newClassName.trim();
};

11

Tôi cũng sử dụng một giải pháp đơn giản / tối thiểu, một dòng, trình duyệt chéo và cũng hoạt động với các trình duyệt cũ:

/\bmyClass/.test(document.body.className) // notice the \b command for whole word 'myClass'

Phương pháp này rất tuyệt vì không yêu cầu polyfill và nếu bạn sử dụng chúng cho classListhiệu suất tốt hơn nhiều. Ít nhất là đối với tôi.

Cập nhật: Tôi đã tạo một polyfill nhỏ xíu đó là một giải pháp toàn diện mà tôi sử dụng bây giờ:

function hasClass(element,testClass){
  if ('classList' in element) { return element.classList.contains(testClass);
} else { return new Regexp(testClass).exec(element.className); } // this is better

//} else { return el.className.indexOf(testClass) != -1; } // this is faster but requires indexOf() polyfill
  return false;
}

Đối với các thao tác lớp khác, xem tập tin đầy đủ ở đây .


2
Chuyến đi này sẽ qua một lớp học notmyClassHere?
Teepeemm

2
Bạn cũng có thể hỏi nếu lớp của bạn không ở đó cũng như !/myClass/.test(document.body.className)chú ý !biểu tượng.
năm15 lúc 0:30

1
Tôi không nói về việc phủ nhận câu hỏi. Tôi nghĩ rằng chức năng của bạn sẽ trả về không đúng nếu tên lớp là thisIsmyClassHere.
Teepeemm

1
Tôi chỉ đoán đó là những gì bạn hỏi, không hiểu chính xác những gì bạn cần, nhưng bạn đã thử chưa và nó không trả lại đúng / sai như mong muốn?
thednp

2
Điều này là không hoàn hảo vì nó không phải là bằng chứng. Ví dụ: khi document.body. ClassName = 'myClass123', sau đó /myClass/.test(document.body. ClassName) trả về đúng ...
Zbigniew Wiadro

9

một giải pháp tốt cho việc này là làm việc với classList và chứa.

tôi đã làm nó như thế này:

... for ( var i = 0; i < container.length; i++ ) {
        if ( container[i].classList.contains('half_width') ) { ...

Vì vậy, bạn cần yếu tố của bạn và kiểm tra danh sách các lớp. Nếu một trong các lớp giống với lớp bạn tìm kiếm, nó sẽ trả về true nếu không nó sẽ trả về false!


6

Sử dụng một cái gì đó như:

Array.prototype.indexOf.call(myHTMLSelector.classList, 'the-class');

3
Điều này không tương đương với myHTMLSelector.classList.indexOf('the-class')? >=0Cuối cùng bạn cũng không muốn sao?
Teepeemm

5
Điểm của việc sử dụng [].indexOfnếu classListcó một containsphương pháp là gì?
Oriol

@Teepeemm không. myHTMLSelector.classList.indexOf('the-class')trả về lỗi đó myHTMLSelector.classList.indexOf is not a functionmyHTMLSelector.classListkhông phải là một mảng. Nhưng tôi đoán khi gọi nó bằng cách sử dụng Array.prototypemột số chuyển đổi xảy ra. Điều này có thể hỗ trợ trình duyệt cũ hơn, mặc dù containscó hỗ trợ rất tốt.
Ehsan88


2

Chức năng 'hasClass' này hoạt động trong IE8 +, FireFox và Chrome:

hasClass = function(el, cls) {
    var regexp = new RegExp('(\\s|^)' + cls + '(\\s|$)'),
        target = (typeof el.className === 'undefined') ? window.event.srcElement : el;
    return target.className.match(regexp);
}

1

Vâng tất cả các câu trả lời ở trên là khá tốt nhưng đây là một chức năng nhỏ đơn giản mà tôi đã đánh lên. Nó hoạt động khá tốt.

function hasClass(el, cn){
    var classes = el.classList;
    for(var j = 0; j < classes.length; j++){
        if(classes[j] == cn){
            return true;
        }
    }
}

3
Điểm lặp nếu classListcó một containsphương pháp là gì?
Oriol

1

Bạn nghĩ gì về phương pháp này?

<body class="thatClass anotherClass"> </body>

var bodyClasses = document.querySelector('body').className;
var myClass = new RegExp("thatClass");
var trueOrFalse = myClass.test( bodyClasses );

https://jsfiddle.net/5sv30bhe/


2
Tôi nghĩ bạn đang trộn tên biến của mình (active === myClass?). Nhưng phương pháp này sẽ không tích cực class="nothatClassIsnt"?
Teepeemm

0

Đây là cách đơn giản nhất:

var allElements = document.querySelectorAll('*');
for (var i = 0; i < allElements.length; i++) {
    if (allElements[i].hasAttribute("class")) {
         //console.log(allElements[i].className);
         if (allElements[i].className.includes("_the _class ")) { 
              console.log("I see the class");
         }
    }
}
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.