ตรวจสอบว่าองค์ประกอบมีคลาสใน JavaScript หรือไม่?


586

ใช้ JavaScript ธรรมดา (ไม่ใช่ jQuery) มีวิธีการตรวจสอบว่าองค์ประกอบมีคลาสหรือไม่?

ขณะนี้ฉันกำลังทำสิ่งนี้:

var test = document.getElementById("test");
var testClass = test.className;

switch (testClass) {
  case "class1":
    test.innerHTML = "I have class1";
    break;
  case "class2":
    test.innerHTML = "I have class2";
    break;
  case "class3":
    test.innerHTML = "I have class3";
    break;
  case "class4":
    test.innerHTML = "I have class4";
    break;
  default:
    test.innerHTML = "";
}
<div id="test" class="class1"></div>

ปัญหาคือถ้าฉันเปลี่ยน HTML เป็น ...

<div id="test" class="class1 class5"></div>

... ไม่มีการจับคู่ที่แน่นอนอีกต่อไปดังนั้นฉันจึงได้ผลลัพธ์ที่ไม่มีค่าเริ่มต้น ( "") แต่ผมก็ยังต้องการที่จะออกI have class1เพราะ<div>ยังคงมี.class1ระดับ


5
element.classList.contain (cls)
Ronnie Royston

คำตอบ:


1036

ใช้วิธีการ:element.classList .contains

element.classList.contains(class);

ใช้งานได้กับเบราว์เซอร์ปัจจุบันทั้งหมดและมี polyfills ให้การสนับสนุนเบราว์เซอร์รุ่นเก่าด้วย


อีกทางเลือกหนึ่งถ้าคุณทำงานกับเบราว์เซอร์รุ่นเก่าและไม่ต้องการใช้โพลีเติมเพื่อแก้ไขพวกเขาการใช้indexOfถูกต้อง แต่คุณต้องปรับแต่งเล็กน้อย:

function hasClass(element, className) {
    return (' ' + element.className + ' ').indexOf(' ' + className+ ' ') > -1;
}

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

การสาธิต

jQuery ใช้วิธีการที่คล้ายกัน (ถ้าไม่เหมือนกัน)


นำไปใช้กับตัวอย่าง:

เนื่องจากสิ่งนี้ไม่ได้ทำงานร่วมกับคำสั่ง switch คุณสามารถบรรลุผลเช่นเดียวกันกับรหัสนี้:

var test = document.getElementById("test"),
    classes = ['class1', 'class2', 'class3', 'class4'];

test.innerHTML = "";

for(var i = 0, j = classes.length; i < j; i++) {
    if(hasClass(test, classes[i])) {
        test.innerHTML = "I have " + classes[i];
        break;
    }
}

มันซ้ำซ้อนน้อยกว่า;)


ยอดเยี่ยม แต่ฉันจะใช้สิ่งนั้นร่วมกับคำสั่ง switch เพื่อให้ฉันสามารถเปลี่ยนเอาต์พุตตามคลาส div ที่มีอยู่ได้อย่างไร
daGUY

@daGUY: คุณต้องการทำอะไรกับคำสั่ง switch ต่อไป เช่นที่สองdivมีสองชั้น แต่มันจะส่งออกเท่านั้นในขณะที่คุณกำลังใช้I have class1 breakหากคุณต้องการส่งออกทุกคลาสที่องค์ประกอบมีอยู่คุณก็สามารถนำclassNameและแยกออกเป็นพื้นที่สีขาว หรือเป้าหมายที่แท้จริงของคุณคืออะไร?
Felix Kling

@ Felix Kling: ฉันต้องการ InnerHTML ของ div เพื่อเปลี่ยนระหว่างสี่สายที่แตกต่างกันขึ้นอยู่กับว่ามันมีคลาสไหน ฉันเพิ่งใช้ "ฉันมี class1" ฯลฯ เป็นตัวอย่าง - สตริงจริงต่างกันทั้งหมด ฉันจะแสดงทีละหนึ่งสตริงเท่านั้นโดยไม่รวมสิ่งใด ๆ ฉันแค่อยากให้มันยังคงใช้ได้แม้ว่าคลาสที่ตรงกันเป็นหนึ่งในหลาย ๆ คลาสบน div
daGUY

@ เฟลิกซ์คลิง: มันทำได้ขอบคุณมาก! จริง ๆ แล้วฉันไม่ได้แสดงชื่อคลาส แต่เป็นหนึ่งในสี่สายอักขระที่แตกต่างกันโดยสิ้นเชิงดังนั้นฉันจึงแก้ไขด้วยคำสั่ง IF / ELSE IF เล็กน้อยเพื่อจัดการแต่ละรายการ ทำงานได้อย่างสมบูรณ์แม้ว่า
daGUY

1
มีเหตุผลเฉพาะที่ทำให้คุณเพิ่มช่องว่างก่อนหรือหลัง?
Ced

93

วิธีแก้ปัญหาที่ง่ายและมีประสิทธิภาพกำลังพยายามหาวิธี

test.classList.contains(testClass);

3
containsวิธีการของelement.classListสถานที่ให้บริการ
user907860

7
NB! ไม่รองรับทุกเบราว์เซอร์รายละเอียดเพิ่มเติมที่นี่: caniuse.com/#feat=classlist
Silver Ringvee

4
นี่เป็นคำตอบที่ดีมากและฉันเชื่อว่า. ผู้บังคับบัญชา () ได้รับการสนับสนุนที่กว้างขึ้นในขณะนี้
นิโคลัส Kreidberg

49

ในเบราว์เซอร์ที่ทันสมัยคุณก็สามารถใช้containsวิธีการElement.classList:

testElement.classList.contains(className)

การสาธิต

var testElement = document.getElementById('test');

console.log({
    'main' : testElement.classList.contains('main'),
    'cont' : testElement.classList.contains('cont'),
    'content' : testElement.classList.contains('content'),
    'main-cont' : testElement.classList.contains('main-cont'),
    'main-content' : testElement.classList.contains('main-content')
});
<div id="test" class="main main-content content"></div>


เบราว์เซอร์ที่รองรับ

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

(จากCanIUse.com )


polyfill

หากคุณต้องการที่จะใช้Element.classListแต่คุณยังต้องการที่จะสนับสนุนเบราว์เซอร์รุ่นเก่าพิจารณาใช้polyfill นี้โดยอีไลสีเทา


10

เนื่องจากเขาต้องการใช้สวิตช์ () ฉันประหลาดใจที่ยังไม่มีใครพูดถึงเรื่องนี้:

var test = document.getElementById("test");
var testClasses = test.className.split(" ");
test.innerHTML = "";
for(var i=0; i<testClasses.length; i++) {
    switch(testClasses[i]) {
        case "class1": test.innerHTML += "I have class1<br/>"; break;
        case "class2": test.innerHTML += "I have class2<br/>"; break;
        case "class3": test.innerHTML += "I have class3<br/>"; break;
        case "class4": test.innerHTML += "I have class4<br/>"; break;
        default: test.innerHTML += "(unknown class:" + testClasses[i] + ")<br/>";
    }
}

1
ฉันแค่สงสัยในสิ่งเดียวกัน แต่ใช่นั่นเป็นปัญหาที่ใกล้เคียงที่สุด!
Silver Ringvee

8

Element.matches ()

element.matches (selectorString)

ตามเอกสาร MDN Web :

Element.matches()วิธีการส่งกลับtrueถ้าองค์ประกอบจะได้รับเลือกจากตัวเลือกสตริงระบุ; falseมิฉะนั้นผลตอบแทน

ดังนั้นคุณสามารถใช้Element.matches()เพื่อตรวจสอบว่าองค์ประกอบมีชั้นเรียน

const element = document.querySelector('#example');

console.log(element.matches('.foo')); // true
<div id="example" class="foo bar"></div>

ดูความเข้ากันได้เบราว์เซอร์


7

นี่เป็นตัวอย่างเล็กน้อยหากคุณพยายามตรวจสอบองค์ประกอบที่มีคลาสโดยไม่ต้องใช้ jQuery

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

บัญชีนี้เนื่องจากข้อเท็จจริงที่ว่าองค์ประกอบอาจมีหลายชื่อชั้นคั่นด้วยช่องว่าง

หรือ


คุณยังสามารถกำหนดฟังก์ชั่นนี้ให้กับองค์ประกอบต้นแบบ

Element.prototype.hasClass = function(className) {
    return this.className && new RegExp("(^|\\s)" + className + "(\\s|$)").test(this.className);
};

และทริกเกอร์แบบนี้ (คล้ายกับ.hasClass()ฟังก์ชั่นของ jQuery ):

document.getElementById('MyDiv').hasClass('active');

ฉันชอบโซลูชันนี้มากกว่า มันหลีกเลี่ยงปัญหาของชื่อคลาสที่ตรงกับคลาสอื่นบางส่วนและไม่ต้องการให้ polyfills ทำงานใน IE
scoota269

5

ผู้เผยแพร่เองที่เรียบง่าย: 1

function hasClassName(classname,id) {
 return  String ( ( document.getElementById(id)||{} ) .className )
         .split(/\s/)
         .indexOf(classname) >= 0;
}

1 indexOfสำหรับอาร์เรย์ไม่รองรับ IE (ofcourse) มีแผ่นแปะลิงมากมายที่จะพบได้บนอินเทอร์เน็ต


1
ปัญหาเกี่ยวกับขอบเขตของคำคืออักขระบางตัวที่ใช้ได้สำหรับชื่อคลาสเช่น-ถือว่าเป็นขอบเขตของคำ เช่นมองหาfooและชั้นคืออัตราผลตอบแทนfoo-bar true
เฟลิกซ์

คุณพูดถูก ลบต้นฉบับเพิ่มวิธีอื่น ยังคงเป็นตัวแปลงสัญญาณ
KooiInc

5

นี่เก่าไปหน่อย แต่บางทีมีใครบางคนอาจหาวิธีแก้ปัญหาของฉันได้:

// Fix IE's indexOf Array
if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function (searchElement) {
        if (this == null) throw new TypeError();
        var t = Object(this);
        var len = t.length >>> 0;
        if (len === 0) return -1;
        var n = 0;
        if (arguments.length > 0) {
            n = Number(arguments[1]);
            if (n != n) n = 0;
            else if (n != 0 && n != Infinity && n != -Infinity) n = (n > 0 || -1) * Math.floor(Math.abs(n));
        }
        if (n >= len) return -1;
        var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);
        for (; k < len; k++) if (k in t && t[k] === searchElement) return k;
        return -1;
    }
}
// add hasClass support
if (!Element.prototype.hasClass) {
    Element.prototype.hasClass = function (classname) {
        if (this == null) throw new TypeError();
        return this.className.split(' ').indexOf(classname) === -1 ? false : true;
    }
}

ใช้: 'element.hasClass (' classname ');
Dementic

ทำไมคุณถึงใช้ t.length >>> 0 เท่าที่ฉันรู้มันเป็น noop ถ้าคุณใช้ '0' ใช่ไหม?
Vitor Canova

ว้าวรหัสมากสำหรับสิ่งที่ง่าย ทำไมไม่ใช้การแสดงออกปกติและไม่บูรณาการล้อ? คุณสามารถใช้ /^class_name_you_are_searching_for$/.test(myElement.className)
pqsk

1
ฉันเขียนมันเร็วเกินไป เพียงเพื่อไม่ overcomplicate แสดงออกปกติของฉันมันจะ /\s*class_name_you_are_searching_for\s*/.test(myElement.className)
pqsk

@pqsk - ฉันเขียนห้องสมุดของตัวเองเพื่อใช้ในอนาคต และนี่เพิ่มเข้าไปในสแต็คของฉัน แน่นอนว่าโซลูชันอื่น ๆ จะใช้งานได้นี่เป็นเพียงวิธีที่ฉันต้องการ
Dementic

4

classNameเป็นเพียงสตริงเพื่อให้คุณสามารถใช้ฟังก์ชั่นปกติindexOfเพื่อดูว่ารายการของชั้นเรียนมีสตริงอื่น


1
แล้วการทดสอบคลาสclassในตัวอย่างข้างต้นล่ะ
เฟลิกซ์

6
จากประสบการณ์วิธีนี้มีความเสี่ยงมาก: มันจะกลับมาจริงเมื่อคุณมองหาชั้นเรียนfooในองค์ประกอบที่มีfoobarชั้นเรียน
Zirak

2
แน่นอนคุณแค่ต้องระวังสิ่งที่คุณกำลังทดสอบ โค้ดของ Felix ทำงานได้ดีโดยใช้ช่องว่างเป็นตัวคั่น
David

ไม่สามารถบัญชีอินสแตนซ์ที่ซ้อนกันของชื่อคลาสได้ ตัวอย่าง: 'สิ้นสุด' สามารถพบได้ในชื่อคลาส 'ส่วนหน้า'
Anthony Rutledge

4

ฉันรู้ว่ามีคำตอบมากมาย แต่ส่วนใหญ่เป็นฟังก์ชั่นเพิ่มเติมและคลาสเพิ่มเติม นี่คือสิ่งที่ฉันใช้เป็นการส่วนตัว; ทำความสะอาดมากขึ้นและมากน้อยกว่าบรรทัดของรหัส!

if( document.body.className.match('category-page') ) { 
  console.log('yes');
}

1
วิธีนี้อาจส่งคืนผลบวกปลอมเมื่อค้นหาชื่อคลาสที่ตรงกับบางส่วน - เช่น<body class="category-page">และ document.body.className.match('page')- จะจับคู่ แต่ไม่มีคลาสที่pageแนบกับองค์ประกอบ
hooblei

สามารถแก้ไขได้ด้วย\bเช่น/\bpage\b/gเนื่องจากเป็น regex (หมายเหตุ: ต้องใช้/ /g)
Andrew

2

นี่เป็นวิธีแก้ปัญหาเล็ก ๆ น้อย ๆ

function hasClass(element, classNameToTestFor) {
    var classNames = element.className.split(' ');
    for (var i = 0; i < classNames.length; i++) {
        if (classNames[i].toLowerCase() == classNameToTestFor.toLowerCase()) {
            return true;
        }
    }
    return false;
}

2

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

if ( element.getAttribute('class') === 'classname' ) {

}

2

ฉันได้สร้างวิธีการต้นแบบที่ใช้classListถ้าเป็นไปได้มีวิธีอื่นที่indexOf:

Element.prototype.hasClass = Element.prototype.hasClass || 
  function(classArr){
    var hasClass = 0,
        className = this.getAttribute('class');
  
    if( this == null || !classArr || !className ) return false;
  
    if( !(classArr instanceof Array) )
      classArr = classArr.split(' ');

    for( var i in classArr )
      // this.classList.contains(classArr[i]) // for modern browsers
      if( className.split(classArr[i]).length > 1 )  
          hasClass++;

    return hasClass == classArr.length;
};


///////////////////////////////
// TESTS (see browser's console when inspecting the output)

var elm1 = document.querySelector('p');
var elm2 = document.querySelector('b');
var elm3 = elm1.firstChild; // textNode
var elm4 = document.querySelector('text'); // SVG text

console.log( elm1, ' has class "a": ', elm1.hasClass('a') );
console.log( elm1, ' has class "b": ', elm1.hasClass('b') );
console.log( elm1, ' has class "c": ', elm1.hasClass('c') );
console.log( elm1, ' has class "d": ', elm1.hasClass('d') );
console.log( elm1, ' has class "a c": ', elm1.hasClass('a c') );
console.log( elm1, ' has class "a d": ', elm1.hasClass('a d') );
console.log( elm1, ' has class "": ', elm1.hasClass('') );

console.log( elm2, ' has class "a": ', elm2.hasClass('a') );

// console.log( elm3, ' has class "a": ', elm3.hasClass('a') );

console.log( elm4, ' has class "a": ', elm4.hasClass('a') );
<p class='a b c'>This is a <b>test</b> string</p>
<svg xmlns="http://www.w3.org/2000/svg" width="100px" height="50px">
    <text x="10" y="20" class='a'>SVG Text Example</text>
</svg>

หน้าทดสอบ


มีเหตุผลที่คุณต้องการใช้ classlist แทน index ของ e.className หรือไม่? ดูเหมือนว่าสิ่งดีเลิศจะน้อยกว่าอย่าง
สิ้นเชิง

@Ced - เอ่อ perf ไม่เกี่ยวข้องถ้าคุณไม่ได้ทดสอบองค์ประกอบหลายพันรายการสำหรับคลาสของพวกเขา (มันอาจจะถูก refactored ในเบราว์เซอร์ในอนาคต) มีความหรูหรามากกว่าที่จะใช้เพราะรหัสอธิบายการทำงานของมัน แต่บรรทัดล่างมันไม่สำคัญทำอะไรก็ได้ที่คุณต้องการ :)
vsync

1
  1. กลอุบายของเฟลิกซ์ในการเพิ่มช่องว่างเพื่อให้ className อยู่ด้านข้างและสตริงที่คุณค้นหานั้นเป็นวิธีที่เหมาะสมในการพิจารณาว่าองค์ประกอบนั้นมีคลาสหรือไม่

  2. ในการมีพฤติกรรมที่แตกต่างกันตามคลาสคุณอาจใช้การอ้างอิงฟังก์ชันหรือฟังก์ชันภายในแผนที่:

    function fn1(element){ /* code for element with class1 */ }
    
    function fn2(element){ /* code for element with class2 */ }
    
    function fn2(element){ /* code for element with class3 */ }
    
    var fns={'class1': fn1, 'class2': fn2, 'class3': fn3};
    
    for(var i in fns) {
        if(hasClass(test, i)) {
            fns[i](test);
        }
    }
    • for (var i ใน fns) ทำซ้ำผ่านปุ่มต่าง ๆ ในแผนที่ fns
    • ไม่มีการหยุดพักหลังจาก fnsi อนุญาตให้เรียกใช้โค้ดเมื่อใดก็ตามที่มีการแข่งขัน - ดังนั้นหากองค์ประกอบมี fi, class1 และ class2 ทั้ง fn1 และ fn2 จะถูกดำเนินการ
    • ข้อดีของวิธีการนี้คือรหัสที่ใช้ในแต่ละคลาสนั้นเป็นกฎเกณฑ์เช่นเดียวกับในคำสั่ง switch ในตัวอย่างของคุณทุกกรณีทำการดำเนินการที่คล้ายกัน แต่พรุ่งนี้คุณอาจต้องทำสิ่งต่าง ๆ สำหรับแต่ละคน
    • คุณอาจจำลองกรณีเริ่มต้นโดยให้ตัวแปรสถานะบอกว่าพบการแข่งขันในลูปหรือไม่

1

ฉันจะโพลีเติมฟังก์ชั่น classList และใช้ไวยากรณ์ใหม่ วิธีนี้เบราว์เซอร์ที่ใหม่กว่าจะใช้การใช้งานใหม่ (ซึ่งเร็วกว่ามาก) และมีเพียงเบราว์เซอร์รุ่นเก่าเท่านั้นที่จะได้รับประสิทธิภาพจากโค้ด

https://github.com/remy/polyfills/blob/master/classList.js


1

นี่เป็นเรื่องเล็กน้อย แต่ถ้าคุณมีเหตุการณ์ที่ทำให้เกิดการสลับคุณสามารถทำได้โดยไม่ต้องเรียน

<div id="classOne1"></div>
<div id="classOne2"></div>
<div id="classTwo3"></div>

คุณทำได้

$('body').click( function() {

    switch ( this.id.replace(/[0-9]/g, '') ) {
        case 'classOne': this.innerHTML = "I have classOne"; break;
        case 'classTwo': this.innerHTML = "I have classTwo"; break;
        default: this.innerHTML = "";
    }

});

.replace(/[0-9]/g, '')idเอาตัวเลขจาก

มันค่อนข้างแฮ็ก แต่ใช้งานได้กับสวิตช์แบบยาวโดยไม่มีฟังก์ชั่นหรือลูปเพิ่มเติม


1

ดูลิงค์ Codepen นี้สำหรับวิธีที่รวดเร็วและง่ายในการตรวจสอบองค์ประกอบหากมีคลาสเฉพาะโดยใช้ JavaScript วานิลลา ~!

hasClass (Vanilla JS)

function hasClass(element, cls) {
    return (' ' + element.className + ' ').indexOf(' ' + cls + ' ') > -1;
}

1

สิ่งนี้ได้รับการสนับสนุนบน IE8 +

ก่อนอื่นเราตรวจสอบว่าclassListมีอยู่หากเราสามารถใช้containsวิธีการที่ IE10 + สนับสนุน ถ้าเราอยู่บน IE9 หรือ 8 มันกลับไปใช้ regex ซึ่งไม่ได้มีประสิทธิภาพ แต่เป็น polyfill สั้น ๆ

if (el.classList) {
  el.classList.contains(className);
} else {
  new RegExp('(^| )' + className + '( |$)', 'gi').test(el.className);
}

อีกทางเลือกหนึ่งถ้าคุณกำลังรวบรวมกับ Babel คุณสามารถใช้: el.classList.contains(className);


0

ลองอันนี้:

document.getElementsByClassName = function(cl) {
   var retnode = [];
   var myclass = new RegExp('\\b'+cl+'\\b');
   var elem = this.getElementsByTagName('*');
   for (var i = 0; i < elem.length; i++) {
       var classes = elem[i].className;
       if (myclass.test(classes)) retnode.push(elem[i]);
   }
    return retnode;
};

1
ระวังด้วยคำว่าขอบเขต นอกจากนี้ยังจะตรงกับความจริงถ้าคุณมีเช่นระดับและค้นหาfoo-bar foo
เฟลิกซ์

1
สวัสดี Jimy ดังนั้นฉันกำลังค้นหา\ metacharacter นี้และพิจารณาเพียง [ a-zA-Z0-9_] เป็นอักขระคำเท่านั้น ดังนั้นสำหรับclassnamesมีถ่านลบนี้จะไม่ทำงาน
Stano

0

ฉันคิดว่าทางออกที่สมบูรณ์แบบจะเป็นเช่นนี้

if ($(this).hasClass("your_Class")) 
    alert("positive");            
else              
    alert("Negative");

8
1. "การใช้ JavaScript ธรรมดา (ไม่ใช่ jQuery)" 2. ใช้เครื่องหมายวงเล็บ
nkmol

3 - ใช้วงเล็บ
TheBlackBenzKid

0

องค์ประกอบใดที่อยู่ในชั้นเรียน '.bar' นี่คือทางออกอื่น แต่ขึ้นอยู่กับคุณ

var reg = /Image/g, // regexp for an image element
query = document.querySelector('.bar'); // returns [object HTMLImageElement]
query += this.toString(); // turns object into a string

if (query.match(reg)) { // checks if it matches
  alert('the class .bar is attached to the following Element:\n' + query);
}

การสาธิต jsfiddle

หลักสูตรนี้เป็นเพียงการค้นหา 1 องค์ประกอบที่เรียบง่าย<img>( /Image/g) แต่คุณสามารถใส่ทั้งหมดในอาร์เรย์เช่น<li>เป็น/LI/g, <ul>= /UL/gฯลฯ


0

เพียงเพิ่มคำตอบสำหรับผู้ที่พยายามค้นหาชื่อคลาสภายในองค์ประกอบ SVG แบบอินไลน์

เปลี่ยนhasCLass()ฟังก์ชั่นเป็น:

function hasClass(element, cls) {
    return (' ' + element.getAttribute('class') + ' ').indexOf(' ' + cls + ' ') > -1;
  }

แทนที่จะใช้classNameคุณสมบัติคุณจะต้องใช้getAttribute()วิธีการเพื่อคว้าชื่อคลาส


0

ฉันสร้างฟังก์ชั่นเหล่านี้สำหรับเว็บไซต์ของฉันฉันใช้เฉพาะวานิลลาจาวาสคริปต์บางทีมันอาจจะช่วยใครบางคน ก่อนอื่นฉันสร้างฟังก์ชันเพื่อรับองค์ประกอบ HTML:

//return an HTML element by ID, class or tag name
    var getElement = function(selector) {
        var elements = [];
        if(selector[0] == '#') {
            elements.push(document.getElementById(selector.substring(1, selector.length)));
        } else if(selector[0] == '.') {
            elements = document.getElementsByClassName(selector.substring(1, selector.length));
        } else {
            elements = document.getElementsByTagName(selector);
        }
        return elements;
    }

จากนั้นฟังก์ชันที่รับคลาสเพื่อลบและตัวเลือกของอิลิเมนต์:

var hasClass = function(selector, _class) {
        var elements = getElement(selector);
        var contains = false;
        for (let index = 0; index < elements.length; index++) {
            const curElement = elements[index];
            if(curElement.classList.contains(_class)) {
                contains = true;
                break;
            }
        }
        return contains;
    }

ตอนนี้คุณสามารถใช้มันได้เช่นนี้:

hasClass('body', 'gray')
hasClass('#like', 'green')
hasClass('.button', 'active')

หวังว่ามันจะช่วย


0

เคล็ดลับ:ลองลบการอ้างอิงของ jQuery ในโครงการของคุณให้มากที่สุดเท่าที่จะทำได้ - VanillaJS VanillaJS

document.firstElementChildส่งคืน<html>แท็กจากนั้นclassListแอตทริบิวต์จะส่งคืนคลาสที่เพิ่มทั้งหมด

if(document.firstElementChild.classList.contains("your-class")){
    // <html> has 'your-class'
} else {
    // <html> doesn't have 'your-class'
}

-1

สำหรับฉันวิธีที่ดีที่สุดและเร็วที่สุดเพื่อให้บรรลุคือ:

function hasClass(el,cl){
   return !!el.className && !!el.className.match(new RegExp('\\b('+cl+')\\b'));
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.