ฟังก์ชัน“ hasClass” กับ JavaScript ธรรมดาคืออะไร


313

คุณจะทำ jQuery hasClassกับ JavaScript ธรรมดา 'ได้อย่างไร ตัวอย่างเช่น,

<body class="foo thatClass bar">

JavaScript มีวิธีการถามว่า<body>มีthatClassอะไร?


ฉันคิดว่าคุณจะต้องแยกวิเคราะห์classคุณสมบัติ (ซึ่งในกรณีที่มีหลายคลาสจะมีชื่อคลาสหลายชื่อตามลำดับแบบสุ่มคั่นด้วยช่องว่าง) และตรวจสอบว่าชื่อคลาสของคุณอยู่ในนั้นหรือไม่ ไม่ยากมาก แต่ก็ยังไม่สะดวกอย่างมากหากไม่ใช่เพื่อการเรียนรู้ :)
Pekka

7
ไม่ทราบว่าฉันมาสายสำหรับงานปาร์ตี้ แต่เว็บไซต์ที่ดีที่ให้ทางเลือกในการทำงานของ jQuery คือyoumightnotneedjquery.com
ithil

คำตอบ:


116

คุณสามารถตรวจสอบว่าตรงกับelement.className ตรงกับตัวแบ่งคำ/\bthatClass\b/
\b

หรือคุณสามารถใช้การดำเนินการของ jQuery ได้:

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

เพื่อตอบคำถามทั่วไปของคุณเพิ่มเติมคุณสามารถดูซอร์สโค้ดของ jQuery บน github หรือที่แหล่งข้อมูลสำหรับhasClassเฉพาะในวิวเวอร์ซอร์สโค้ดนี้


6
+1 สำหรับการใช้ jQuery (จากการค้นหา (ภาษาอังกฤษนี้เหมาะสมหรือไม่) คืออะไรrclassจริง ๆ ))
Felix Kling

6
จะไม่\bตรงกับ "thatClass-anotherClass" หรือไม่
Matthew Crumley

3
เพียงเพื่อความสมบูรณ์: rclass ในรุ่นล่าสุดคือ "/ [\ n \ t \ r] / g" (เพิ่ม \ r)
เฟลิกซ์ชวาร์ซ

4
@FelixSchwarz ที่ถูกต้องในปัจจุบัน jQuery regexp /[\t\r\n\f]/gได้รับการปรับปรุงเพื่อ นอกจากนี้ยังเป็นเรื่องดีที่จะกล่าวถึงว่า/\bclass\b/ชื่อกลุ่มที่มี-เครื่องหมายลบไม่ได้ (นอกจากนั้นใช้งานได้ดี) นั่นเป็นเหตุผลว่าทำไมการติดตั้ง jQuery จึงดีขึ้นและเชื่อถือได้ ตัวอย่างเช่น: /\bbig\b/.test('big-text')คืนค่าจริงแทนที่จะเป็นเท็จที่คาดไว้
Stano

994

เพียงใช้classList.contains():

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

การใช้งานอื่น ๆ ของ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');

การสนับสนุนเบราว์เซอร์:

  • Chrome 8.0
  • Firefox 3.6
  • IE 10
  • Opera 11.50
  • Safari 5.1

classList สนับสนุนเบราว์เซอร์


5
นี้ได้รับการสนับสนุนใน IE8 IE8 สามารถดึงข้อมูล.classListเป็นสตริงได้ แต่จะไม่รู้จักวิธีการที่ทันสมัยกว่าเช่น.classList.contains()
iono

7
@iono ในคำอธิบายการใช้งานElement.classListจาก MDN มี shim ที่ขยายการสนับสนุนพฤติกรรมนี้เป็น IE8 developer.mozilla.org/en-US/docs/Web/API/Element/classList
James

3
ฉันเห็นด้วยกับ @AlexanderWigmore นี่เป็นประโยชน์และเรียบง่ายอย่างไม่น่าเชื่อ
Jacques Olivier

โหวตสิ่งนี้ วิธีนี้เป็นวิธีที่สะดวกกว่าในการค้นหาคลาส
user2190488

@SLaks ควรอัปเดตเป็นคำตอบที่ยอมรับแล้ว
Umur Karagöz

35

ซับที่มีประสิทธิภาพที่สุดที่

  • ส่งคืนบูลีน (ตรงข้ามกับคำตอบของ Orbling)
  • ไม่กลับมาเป็นบวกเท็จเมื่อค้นหาในองค์ประกอบที่มีthisClassclass="thisClass-suffix"
  • เข้ากันได้กับเบราว์เซอร์ทุกตัวลงไปอย่างน้อย IE6

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

28

classNameแอตทริบิวต์ที่ร้านค้าชั้นเรียนในการใช้งานคือ

ดังนั้นคุณสามารถพูดได้:

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

หากคุณต้องการตำแหน่งที่แสดงให้คุณเห็นว่า jQuery ทำทุกอย่างได้อย่างไรฉันขอแนะนำ:

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


1
ยอดเยี่ยม matchแอตทริบิวต์มามีประโยชน์อีกครั้ง! jQuery จริง ๆ แล้วทำอะไรมากกว่าที่เป็นไปได้ใน JavaScript? ถ้าไม่ jQuery เป็นเพียงการจดชวเลขที่ไม่จำเป็น
animaacija

1
สิ่งนี้จะจับคู่myclass-somethingเหมือน\bจับคู่ยัติภังค์
Marc Durdin

1
@animaacija ไลบรารี / ปลั๊กอินของ javascript ทั้งหมดนั้นเป็นชวเลข javascript เนื่องจากมันสร้างด้วย javascript สิ่งที่: ชวเลขเป็นสิ่งจำเป็นเสมอ อย่าประดิษฐ์ล้อใหม่
Edwin Stoteler

นี่เป็นทางออกที่ยอดเยี่ยม!
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_diesel: อย่ากีดกันคำตอบ! ทางออกใหม่สำหรับปัญหาทั่วไปเป็นมากกว่ายินดีต้อนรับ
raveren

2
@ Raveren ในขณะที่ยินดีต้อนรับทางออกใหม่สำหรับปัญหาเก่าคำตอบนี้ไม่นำอะไรใหม่ มันเพิ่มเสียงให้กับคำถามนี้เท่านั้น
Emile Bergeron

1
@raveren นี่ไม่ใช่โซลูชันใหม่มันเหมือนกับคำตอบนี้แต่มีข้อมูลน้อยกว่า
คดีของกองทุนโมนิกา

13

ฟังก์ชั่น 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;
};

ฟังก์ชั่น addClass:

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

ฟังก์ชัน 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

ฉันใช้โซลูชันที่เรียบง่าย / น้อยที่สุดหนึ่งบรรทัดเบราว์เซอร์ข้ามและทำงานกับเบราว์เซอร์รุ่นเก่าเช่นกัน:

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

วิธีนี้ดีมากเพราะไม่ต้องใช้polyfillsและถ้าคุณใช้มันclassListมันจะดีกว่าในแง่ของประสิทธิภาพ อย่างน้อยสำหรับฉัน

อัปเดต: ฉันสร้างโปลิฟิลเล็ก ๆ ซึ่งเป็นวิธีแก้ปัญหารอบตัวที่ฉันใช้ตอนนี้:

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;
}

สำหรับการจัดการชั้นเรียนอื่น ๆ ให้ดูไฟล์ที่สมบูรณ์ที่นี่


2
ทริปนี้จะเดินทางข้ามชั้นเรียนnotmyClassHereหรือไม่?
Teepeemm

2
นอกจากนี้คุณยังสามารถถามว่าชั้นเรียนของคุณไม่ได้อยู่ที่นั่นเช่นกัน!/myClass/.test(document.body.className)สังเกตเห็น!สัญลักษณ์
thednp

1
ฉันไม่ได้พูดถึงการปฏิเสธคำถาม ฉันคิดว่าหน้าที่ของคุณจะกลับมาจริงถ้าชื่อคลาสไม่ถูกthisIsmyClassHereต้อง
Teepeemm

1
ฉันแค่คาดเดาว่าเป็นสิ่งที่คุณถามไม่เข้าใจอย่างที่คุณต้องการ แต่คุณลองมาแล้วหรือไม่และกลับมาจริง / เท็จตามที่ควรหรือไม่
thednp

2
สิ่งนี้ไม่สมบูรณ์แบบเนื่องจากไม่ได้เป็นวัสดุตั้งต้น เช่นเมื่อ document.body.className = 'myClass123' ดังนั้น /myClass/.test(document.body.className) จะคืนค่าจริง ...
Zbigniew Wiadro

9

ทางออกที่ดีสำหรับสิ่งนี้คือการทำงานกับ classList และมี

ฉันทำแบบนี้:

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

ดังนั้นคุณต้องการองค์ประกอบของคุณและตรวจสอบรายชื่อของชั้นเรียน หากคลาสใดคลาสหนึ่งเหมือนกันกับคลาสที่คุณค้นหาจะส่งคืนค่าจริงหากไม่ใช่คลาสนั้นจะส่งคืนค่าเท็จ!


6

ใช้สิ่งที่ชอบ:

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

3
สิ่งนี้ไม่เทียบเท่าmyHTMLSelector.classList.indexOf('the-class')หรือ คุณไม่ต้องการ>=0ในตอนท้ายด้วยหรือ
Teepeemm

5
[].indexOfถ้าใช้วิธีการclassListมีจุดcontainsคืออะไร?
Oriol

@Teepeemm no. myHTMLSelector.classList.indexOf('the-class')ส่งกลับข้อผิดพลาดที่myHTMLSelector.classList.indexOf is not a functionเพราะmyHTMLSelector.classListไม่ใช่อาร์เรย์ แต่ฉันเดาว่าเมื่อมีการโทรโดยใช้Array.prototypeการแปลงเกิดขึ้น นี่อาจรองรับเบราว์เซอร์รุ่นเก่า แต่containsมีการสนับสนุนที่ดีมาก
Ehsan88


2

ฟังก์ชัน 'hasClass' นี้ใช้งานได้ใน IE8 +, FireFox และ 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

คำตอบข้างต้นทั้งหมดนั้นค่อนข้างดี แต่นี่เป็นฟังก์ชั่นเล็ก ๆ ที่ฉันทำขึ้น มันใช้งานได้ดีทีเดียว

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

3
การทำซ้ำถ้าclassListมีcontainsวิธีคืออะไร?
Oriol

1

คุณคิดอย่างไรเกี่ยวกับวิธีการนี้

<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
ฉันคิดว่าคุณกำลังผสมชื่อตัวแปรของคุณ (active === myClass?) แต่วิธีการนี้จะไม่ให้ผลบวกที่เป็นเท็จclass="nothatClassIsnt"หรือ?
Teepeemm

0

นี่คือวิธีที่ง่ายที่สุด:

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");
         }
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.