如何在 JavaScript 中添加/删除类?

IT技术 javascript dom cross-browser
2021-01-18 06:46:28

由于element.classListIE 9 和 Safari-5 不支持,有什么替代的跨浏览器解决方案?

无框架

解决方案必须至少适用于IE 9Safari 5、FireFox 4、Opera 11.5 和 Chrome。

相关帖子(但不包含解决方案):

  1. 如何添加和删除css类

  2. 添加和删​​除带有动画的类

  3. 添加删除类?

6个回答

这是纯 javascript 解决方案中 addClass、removeClass、hasClass 的解决方案。

实际上它来自http://jaketrent.com/post/addremove-classes-raw-javascript/

function hasClass(ele,cls) {
  return !!ele.className.match(new RegExp('(\\s|^)'+cls+'(\\s|$)'));
}

function addClass(ele,cls) {
  if (!hasClass(ele,cls)) ele.className += " "+cls;
}

function removeClass(ele,cls) {
  if (hasClass(ele,cls)) {
    var reg = new RegExp('(\\s|^)'+cls+'(\\s|$)');
    ele.className=ele.className.replace(reg,' ');
  }
}

看看这些oneliners:

  1. 删除类:

    element.classList.remove('hidden');
    
  2. 切换类(如果该类不存在则添加该类,如果存在则将其删除)

    element.classList.toggle('hidden');
    

就这样!我做了一个测试 - 10000 次迭代。0.8 秒。

请注意,在 OP 的问题中说明的 IE 9 不支持 classList
2021-03-28 06:46:28
虽然它不满足对 OP 非常特殊的限制,但我认为这个问题会被很多人看到,希望能在没有这些特定限制的情况下回答一般问题。我很高兴找到这个,并且在我第二次访问时才注意到它。我很高兴我做到了 - 更清洁的解决方案。谢谢!
2021-04-02 06:46:28

我刚刚写了这些:

function addClass(el, classNameToAdd){
    el.className += ' ' + classNameToAdd;   
}

function removeClass(el, classNameToRemove){
    var elClass = ' ' + el.className + ' ';
    while(elClass.indexOf(' ' + classNameToRemove + ' ') !== -1){
         elClass = elClass.replace(' ' + classNameToRemove + ' ', '');
    }
    el.className = elClass;
}

我认为它们适用于所有浏览器。

这是行不通的。如果元素具有类 'abc' 并且您尝试删除 b,它会将新类设置为 'ac'。所以,你必须改变''通过' 'replace功能。此外,class 是一个保留关键字。
2021-03-22 06:46:28
我使用此代码并在替换语句之后添加此代码:while (elClass[0] === " ") elClass = elClass.substr(1); while (elClass[elClass.length - 1] === " ") elClass = elClass.substr(0, elClass.length - 1);这将删除可能仍然存在的前导和尾随空格
2021-04-02 06:46:28
@Gareth,那行得通。它在 removeClass 的第一行的每一侧插入一个空格。
2021-04-07 06:46:28
我已将您的解决方案修复为 1. 不使用“类”,这是一个保留字 2. 您损坏的removeClass方法,由于未修剪空格而在重复使用后会造成大量混乱 请参阅下面的解决方案作为答案。
2021-04-07 06:46:28
这不起作用,例如,如果您尝试删除元素上唯一的类(其名称两侧没有空格)
2021-04-10 06:46:28

最简单的是element.classList它具有remove(name)add(name)toggle(name)contains(name)方法,现在所有主要浏览器都支持

对于较旧的浏览器,您可以更改element.className. 这里有两个帮手:

function addClass(element, className){
    element.className += ' ' + className;   
}

function removeClass(element, className) {
    element.className = element.className.replace(
        new RegExp('( |^)' + className + '( |$)', 'g'), ' ').trim();
}
这不适用于使用“createElementNS”创建的 svg 元素。如何做到这一点?
2021-04-04 06:46:28

在没有框架/库的情况下使用类的一种方法是使用属性 Element.className,它“获取和设置指定元素的类属性的值。 ”(来自MDN 文档)。
正如@matías-fidemraizer在他的回答中已经提到的那样,一旦您获得元素的类字符串,您就可以使用与字符串关联的任何方法来修改它。

这是一个示例:
假设您有一个 ID 为“myDiv”的 div,并且您想在用户单击它时向其中添加类“main__section”,

window.onload = init;

function init() {
  document.getElementById("myDiv").onclick = addMyClass;
}

function addMyClass() {
  var classString = this.className; // returns the string of all the classes for myDiv
  var newClass = classString.concat(" main__section"); // Adds the class "main__section" to the string (notice the leading space)
  this.className = newClass; // sets className to the new string
}
.replace(/\bexmaple\b/, "")
2021-03-20 06:46:28
这怎么可能是公认的答案,那么问题包括“删除”课程但这个答案不是?
2021-03-24 06:46:28
这不适用于使用“createElementNS”创建的 svg 元素。如何做到这一点?
2021-04-08 06:46:28