ฉันจะสลับคลาสขององค์ประกอบใน JavaScript บริสุทธิ์ได้อย่างไร


128

ฉันกำลังมองหาวิธีแปลงโค้ด jQuery (ซึ่งใช้ในส่วนเมนูตอบสนอง) เป็น JavaScript แท้

หากใช้งานได้ยากก็สามารถใช้กรอบ JavaScript อื่นได้

$('.btn-navbar').click(function()
{
    $('.container-fluid:first').toggleClass('menu-hidden');
    $('#menu').toggleClass('hidden-phone');

    if (typeof masonryGallery != 'undefined') 
        masonryGallery();
});


11
document.getElementById("menu").classList.toggle("hidden-phone"):-)
Bergi

บางเบราว์เซอร์ไม่รองรับclassList
Kevin Whitaker

6
เฮ้ @max ต้องการรับคำตอบอยู่แล้ว?
mikemaccana

คำตอบ:


213

2014 คำตอบ : เป็นมาตรฐานและการสนับสนุนจากเบราว์เซอร์ส่วนใหญ่classList.toggle()

เบราว์เซอร์รุ่นเก่าสามารถใช้use classlist.js สำหรับ classList.toggle () :

var menu = document.querySelector('.menu') // Using a class instead, see note below.
menu.classList.toggle('hidden-phone');

นอกจากนี้คุณไม่ควรใช้ ID ( พวกมันรั่วไหลไปยังwindowวัตถุJS )


ถ้าเราใช้ ID ไม่ได้แล้วจะทำอย่างไร?
คุ

แต่เราจะมีจำนวนคลาสเดียวกันแทน ID เก่าและใช้บางอย่างเช่น var myList = document.getElementsByClassName ("abc")?
Goku

1
คลาส @goku ไม่ปรากฏใต้วัตถุหน้าต่าง ID เท่านั้นที่ทำได้ ดู2ality.com/2012/08/ids-are-global.html
mikemaccana

1
รองรับโดย IE10 และ IE11 ยกเว้นพารามิเตอร์ที่สอง
ด้านล่างเรดาร์

1
ขอบคุณมาก! ใช้งานได้แล้ว :) ฉันเพิ่มตัวเลือกเพิ่มเติมสำหรับ loop: var All = document.querySelectorAll ('. menu'); สำหรับ (var i = 0; i <All.length; i ++) {All [i] .classList.toggle ('hidden-phone'); }
รถรางสีน้ำเงิน

11

นี่คือโซลูชันที่ใช้กับ ES6

const toggleClass = (el, className) => el.classList.toggle(className);

ตัวอย่างการใช้งาน

toggleClass(document.querySelector('div.active'), 'active'); // The div container will not have the 'active' class anymore

3
ES6 นั้นยอดเยี่ยม แต่โซลูชันนี้ใช้เพียงแค่ 'document.querySelector' และ 'element.classList.toggle' ตามคำตอบอื่น ๆ ที่มีอยู่
mikemaccana

ไม่มีการแก้ปัญหาที่ถูกต้องถ้ามันคือ "ผู้ขายที่มุ่งเน้น" Internet เป็นมาตรฐานแบบเปิดที่มุ่งเน้น
Peter Krauss

นี่ไม่ใช่วิธีแก้ปัญหาสำหรับไฟล์จำนวนมาก ใช้ไม่ได้กับ querySelectorAll (อย่างน้อยใน FF) ดังนั้นสำหรับผู้ที่ต้องการสลับคลาสในหลายองค์ประกอบที่อ่าน :-) (ฉันไม่ได้อ่านในตอนแรก - ดังนั้นความคิดเห็นของฉัน!)
kev1807

9

ลองดูตัวอย่างนี้: JS Fiddle

function toggleClass(element, className){
    if (!element || !className){
        return;
    }

    var classString = element.className, nameIndex = classString.indexOf(className);
    if (nameIndex == -1) {
        classString += ' ' + className;
    }
    else {
        classString = classString.substr(0, nameIndex) + classString.substr(nameIndex+className.length);
    }
    element.className = classString;
}

9
จะเกิดอะไรขึ้นถ้าฉันมีชั้นเรียนหลังจาก "red" ชื่อ "redOther"
Tiffany Lowe

4

อันนี้ใช้ได้กับ IE เวอร์ชันก่อนหน้าด้วย

function toogleClass(ele, class1) {
  var classes = ele.className;
  var regex = new RegExp('\\b' + class1 + '\\b');
  var hasOne = classes.match(regex);
  class1 = class1.replace(/\s+/g, '');
  if (hasOne)
    ele.className = classes.replace(regex, '');
  else
    ele.className = classes + class1;
}
.red {
  background-color: red
}
div {
  width: 100px;
  height: 100px;
  margin-bottom: 10px;
  border: 1px solid black;
}
<div class="does red redAnother " onclick="toogleClass(this, 'red')"></div>

<div class="does collapse navbar-collapse " onclick="toogleClass(this, 'red')"></div>


\bขอบเขตของคำไม่สอดคล้องกับตัวแยกชื่อคลาส css เช่นมันใช้ไม่ได้ถ้าชื่อคลาสมีเครื่องหมายขีด ("-") char: btn, btn-red ทั้งคู่จะตรงกัน'\\b' + 'btn' + '\\b'!!
S.Serpooshan

3

นี่อาจจะรวบรัดกว่านี้:

function toggle(element, klass) {
  var classes = element.className.match(/\S+/g) || [],
      index = classes.indexOf(klass);

  index >= 0 ? classes.splice(index, 1) : classes.push(klass);
  element.className = classes.join(' ');
}

0

ลองสิ่งนี้ (หวังว่าจะได้ผล):

// mixin (functionality) for toggle class 
function hasClass(ele, clsName) {
    var el = ele.className;
    el = el.split(' ');
    if(el.indexOf(clsName) > -1){
        var cIndex = el.indexOf(clsName);
        el.splice(cIndex, 1);
        ele.className = " ";
        el.forEach(function(item, index){
          ele.className += " " + item;
        })
    }
    else {
        el.push(clsName);
        ele.className = " ";
        el.forEach(function(item, index){
          ele.className += " " + item;
        })
    }
}

// get all DOM element that we need for interactivity.

var btnNavbar =  document.getElementsByClassName('btn-navbar')[0];
var containerFluid =  document.querySelector('.container-fluid:first');
var menu = document.getElementById('menu');

// on button click job
btnNavbar.addEventListener('click', function(){
    hasClass(containerFluid, 'menu-hidden');
    hasClass(menu, 'hidden-phone');
})`enter code here`

0

นี่คือรหัสสำหรับ IE> = 9 โดยใช้ split ("") บน className:

function toggleClass(element, className) {
    var arrayClass = element.className.split(" ");
    var index = arrayClass.indexOf(className);

    if (index === -1) {
        if (element.className !== "") {
            element.className += ' '
        }
        element.className += className;
    } else {
        arrayClass.splice(index, 1);
        element.className = "";
        for (var i = 0; i < arrayClass.length; i++) {
            element.className += arrayClass[i];
            if (i < arrayClass.length - 1) {
                element.className += " ";
            }
        }
    }
}

0

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

(function(objSelector, objClass){
   document.querySelectorAll(objSelector).forEach(function(o){
      o.addEventListener('click', function(e){
        var $this = e.target,
            klass = $this.className,
            findClass = new RegExp('\\b\\s*' + objClass + '\\S*\\s?', 'g');

        if( !findClass.test( $this.className ) )
            if( klass ) 
                $this.className = klass + ' ' + objClass;
            else 
                $this.setAttribute('class', objClass);
        else 
        {
            klass = klass.replace( findClass, '' );
            if(klass) $this.className = klass;
            else $this.removeAttribute('class');
        }
    });
  });
})('.yourElemetnSelector', 'yourClass');
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.