使用 JavaScript(无 jQuery)从元素中删除 CSS 类

IT技术 javascript html css
2021-01-25 06:14:42

谁能告诉我如何仅使用 JavaScript 删除元素上的类?请不要用 jQuery 给我答案,因为我无法使用它,而且我对此一无所知。

6个回答

正确且标准的方法是使用classList. 它现在在大多数现代浏览器的最新版本中得到广泛支持

ELEMENT.classList.remove("CLASS_NAME");

remove.onclick = () => {
  const el = document.querySelector('#el');
  if (el.classList.contains("red")) {
    el.classList.remove("red");

  }
}
.red {
  background: red
}
<div id='el' class="red"> Test</div>
<button id='remove'>Remove Class</button>

文档:https : //developer.mozilla.org/en/DOM/element.classList

@dzhioev - 我相信是因为它相对较新,旧浏览器不支持(IE 支持从 IE10 开始)
2021-03-13 06:14:42
ELEMENT.classList 有“添加”和“删除”,顺便说一句。
2021-03-14 06:14:42
非常好!这比正则表达式和拆分className成多个部分并手动遍历它们要简单得多
2021-03-15 06:14:42
FWIW,这在 FF 7.0.1 和 Chromium 16.0.910.0 上对我有用
2021-03-24 06:14:42
在 MDN 页面上,为旧浏览器提供了一个垫片。
2021-03-31 06:14:42
document.getElementById("MyID").className =
    document.getElementById("MyID").className.replace(/\bMyClass\b/,'');

其中MyID是元素的 ID,MyClass 是您要删除的类的名称。


更新: 要支持包含破折号字符的类名,例如“My-Class”,请使用

document.getElementById("MyID").className =
  document.getElementById("MyID").className
    .replace(new RegExp('(?:^|\\s)'+ 'My-Class' + '(?:\\s|$)'), ' ');
@PauFracés 检查编辑历史记录。不一致是由其他人介绍的。
2021-03-16 06:14:42
我只是将其复制粘贴到此处,因为这是谷歌将我引导到的页面,而不是在亚当评论中链接的正确答案。 function removeClass(e,c) {e.className = e.className.replace( new RegExp('(?:^|\\s)'+c+'(?!\\S)') ,'');}
2021-03-21 06:14:42
如果有一个空格,我也会删除它: domNode.className.replace(new RegExp(" ?\\b"+cssClass+"\\b"),'')
2021-03-28 06:14:42
如果我错了,请纠正我,但我认为您的第一个参数replace必须是正则表达式,因此不要将其括在引号中:.replace(/\bMyClass\b/,''). 但是然后 'MyClass' 必须是文字,否则也许动态地创建正则表达式可以工作:.replace(new RegExp('\\b' + myClass + '\\b'),'')
2021-03-30 06:14:42
这里不适合使用词边界元字符\b,因为词边界也出现在词字符[A-Za-z0-9_]和破折号-字符之间。因此,类名,例如'different-MyClass'也将被替换,导致'different-'有一个更好的解决方案可以匹配类名周围的空白字符
2021-04-04 06:14:42

这里有一种方法可以将此功能直接烘焙到所有 DOM 元素中:

HTMLElement.prototype.removeClass = function(remove) {
    var newClassName = "";
    var i;
    var classes = this.className.split(" ");
    for(i = 0; i < classes.length; i++) {
        if(classes[i] !== remove) {
            newClassName += classes[i] + " ";
        }
    }
    this.className = newClassName;
}
您还可以通过 \t \n \r 和 \s+ 拆分类,您的 split-nonregex 没有考虑到这一点。
2021-03-17 06:14:42
添加一个 if 包装器 [if (typeof HTMLElement.prototype.removeClass !== "function") {] 以使这个答案最优雅,以防浏览器将来添加对 removeClass 的支持。
2021-03-21 06:14:42
非常优雅,最适用于问题。
2021-03-25 06:14:42
当函数被多次使用时(例如切换活动/停用状态),在 return 末尾添加一个 trim() 以删除多余的空格。
2021-03-27 06:14:42
@Matthew 一种符合逻辑的编程方式。欣赏它。看起来也跨浏览器。是吗???
2021-04-01 06:14:42

试试这个:

function hasClass(ele, cls) {
  return ele.className.match(new RegExp('(\\s|^)'+cls+'(\\s|$)'));
}
    
function removeClass(ele, cls) {
  if (hasClass(ele,cls)) {
    var reg = new RegExp('(\\s|^)'+cls+'(\\s|$)');
    ele.className=ele.className.replace(reg,' ');
  }
}
你需要转义反斜杠
2021-03-13 06:14:42
el.className.replace(/(\s|^)someclass(\s|$)/, ' ')如果您不想创建辅助函数。:)
2021-03-27 06:14:42
为什么是 \\s 而不仅仅是 \s ?想知道。
2021-04-10 06:14:42
div.classList.add("foo");
div.classList.remove("foo");

更多信息请访问https://developer.mozilla.org/en-US/docs/Web/API/element.classList

从 IE 10 和 Android 3 开始的支持不错,太糟糕了。为什么他们 10 年前不编码这些东西?...
2021-03-28 06:14:42
@Andrew 说实话,整个网络技术世界看起来像是一堆没有系统或一致性的想法……
2021-04-10 06:14:42