【问题标题】:Remove CSS class from element with JavaScript (no jQuery) [duplicate]使用 JavaScript(无 jQuery)从元素中删除 CSS 类 [重复]
【发布时间】:2011-01-10 11:24:27
【问题描述】:

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

【问题讨论】:

  • 看看这个:stackoverflow.com/questions/195951/… 这个答案有一些很好的例子。帕特里克。
  • 我建议你检查 jQuery 源代码及其方法 removeClass。
  • document.getElementById("theID").removeAttribute("class")
  • @SandyGood 这将删除所有课程。
  • @ChayaCooper 好的,我不会再坚持了:)

标签: javascript html css


【解决方案1】:

试试这个:

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,' ');
  }
}

【讨论】:

  • el.className.replace(/(\s|^)someclass(\s|$)/, ' ') 如果您不想创建辅助函数。 :)
  • 为什么是 \\s 而不仅仅是 \s ?想知道。
  • 你需要转义反斜杠
【解决方案2】:

正确和标准的方法是使用classList。现在是widely supported in the latest version of most modern browsers:

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

【讨论】:

  • FWIW,这适用于 FF 7.0.1 和 Chromium 16.0.910.0
  • 非常好!这比正则表达式和将className 拆分为多个部分并手动遍历它们要简单得多。
  • @dzhioev - 我相信是因为它相对较新并且在旧浏览器中不受支持(IE 支持从 IE10 开始)
  • 在 MDN 页面上,为旧版浏览器提供了一个 shim。
  • ELEMENT.classList 有'add'和'remove',顺便说一句。
【解决方案3】:
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|$)'), ' ');

【讨论】:

  • 如果我错了,请纠正我,但我认为您在 replace 上的第一个参数必须是正则表达式,所以不要用引号括起来:.replace(/\bMyClass\b/,'')。但是 'MyClass' 必须是一个字面量,否则创建正则表达式可能会起作用:.replace(new RegExp('\\b' + myClass + '\\b'),'')
  • @PauFracés 检查编辑历史。不一致是由其他人引入的。
  • 这里不适合使用word boundary metacharacter \b,因为单词边界也出现在单词字符[A-Za-z0-9_]和破折号-字符之间。因此一个类名,例如'different-MyClass' 也将被替换,从而产生 'different-'。有一个更好的解决方案matches whitespace characters around the class name
  • 如果有空格,我也会删除:domNode.className.replace(new RegExp(" ?\\b"+cssClass+"\\b"),'')
  • 我只是复制粘贴到这里,因为这是谷歌引导我到的不是亚当评论中链接正确答案的页面。 function removeClass(e,c) {e.className = e.className.replace( new RegExp('(?:^|\\s)'+c+'(?!\\S)') ,'');}
【解决方案4】:

我使用这个 JS sn-p 代码:

首先,我到达所有类,然后根据我的目标类的索引,我设置 className = ""

Target = document.getElementsByClassName("yourClass")[1];
Target.className="";

【讨论】:

  • 这不是一个好的解决方案,因为它会从元素中删除所有类。
【解决方案5】:

编辑

好的,完全重写。 已经有一段时间了,我学到了一些东西,并且 cmets 提供了帮助。

Node.prototype.hasClass = function (className) {
    if (this.classList) {
        return this.classList.contains(className);
    } else {
        return (-1 < this.className.indexOf(className));
    }
};

Node.prototype.addClass = function (className) {
    if (this.classList) {
        this.classList.add(className);
    } else if (!this.hasClass(className)) {
        var classes = this.className.split(" ");
        classes.push(className);
        this.className = classes.join(" ");
    }
    return this;
};

Node.prototype.removeClass = function (className) {
    if (this.classList) {
        this.classList.remove(className);
    } else {
        var classes = this.className.split(" ");
        classes.splice(classes.indexOf(className), 1);
        this.className = classes.join(" ");
    }
    return this;
};


旧帖
我只是在处理这样的事情。这是我想出的解决方案...
// Some browsers don't have a native trim() function
if(!String.prototype.trim) {
    Object.defineProperty(String.prototype,'trim', {
        value: function() {
            return this.replace(/^\s+|\s+$/g,'');
        },
        writable:false,
        enumerable:false,
        configurable:false
    });
}
// addClass()
// first checks if the class name already exists, if not, it adds the class.
Object.defineProperty(Node.prototype,'addClass', {
    value: function(c) {
        if(this.className.indexOf(c)<0) {
            this.className=this.className+=' '+c;
        }
        return this;
    },
    writable:false,
    enumerable:false,
    configurable:false
});
// removeClass()
// removes the class and cleans up the className value by changing double 
// spacing to single spacing and trimming any leading or trailing spaces
Object.defineProperty(Node.prototype,'removeClass', {
    value: function(c) {
        this.className=this.className.replace(c,'').replace('  ',' ').trim();
        return this;
    },
    writable:false,
    enumerable:false,
    configurable:false
});

现在您可以拨打myElement.removeClass('myClass')

或链接它:myElement.removeClass("oldClass").addClass("newClass");

【讨论】:

  • 我来得太晚了,但我有一个这样的例子:考虑一个具有类 testClass 和 testClass2 的元素。 (class="testClass testClass2") 我们希望从元素中删除 testClass。使用您的方法的结果:class="2" 这就是为什么将其分成数组是有利的。当然,使用纯字符串操作仍然可以达到正确的结果,但它变得更加复杂。如果您不想要乱七八糟的代码,则需要使用正则表达式。使用数组的好处是代码易读。
  • @YM_Industries 你是对的!我会编辑我的帖子。
  • @Knu Native Element.classList.add() 不支持"one two" 中的空格。
  • @Knu ".one.two"("one", "two", ...)["one","two"]{"0":"one","1":"two"}... 等等。我将把非标准参数处理留给实现其代码的人。 :)
  • IE 支持 classList 。您可以改用正则表达式:this.className = this.className.replace(new RegExp('(?:^|\\s)' + className + '(?:\\s|$)'), '').trim();
【解决方案6】:
document.getElementById("whatever").className += "classToKeep";

使用加号 ('+') 附加类,而不是覆盖任何现有类

【讨论】:

  • 错误,+= 将一个类添加到现有的类列表中
  • 您可以在新添加的类之前添加空格以减少错误。
【解决方案7】:
var element = document.getElementById('example_id');
var remove_class = 'example_class';

element.className = element.className.replace(' ' + remove_class, '').replace(remove_class, '');

【讨论】:

    【解决方案8】:

    我认为这很简单。

    document.getElementById("whatever").classList.remove("className");
    

    【讨论】:

    • 这对跨浏览器的支持很差。 Internet Explorer 10 之前的任何版本都不支持它。developer.mozilla.org/en-US/docs/Web/API/…
    • 这对我来说似乎是正确的答案。如果您担心跨浏览器,请使用 polyfill。 github.com/eligrey/classList.js
    • @ShannonPoole 有时您只需要以兼容 IE8 的方式完成一项简单的任务,并且不希望它依赖于库支持或繁重的 polyfill。
    • @acjay 有时你会小心翼翼,只遵循现代标准 :)
    • 要支持 IE,您可以使用 regex 代替:this.className = this.className.replace(new RegExp('(?:^|\\s)' + className + '(?:\\s|$)'), '').trim();
    【解决方案9】:
    div.classList.add("foo");
    div.classList.remove("foo");
    

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

    【讨论】:

    • 不错,可惜支持从 IE 10 和 Android 3 开始。为什么他们 10 年前没有编写这些代码?..
    • @Andrew 老实说,整个网络技术世界看起来就像一堆没有系统或一致性的想法......
    【解决方案10】:

    这是一种将此功能直接烘焙到所有 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;
    }
    

    【讨论】:

    • 非常优雅,最适用于问题。
    • 添加一个 if 包装器 [if (typeof HTMLElement.prototype.removeClass !== "function") {] 以使这个答案最优雅,以防浏览器将来添加对 removeClass 的支持..跨度>
    • @Matthew 一种逻辑编程方式。欣赏它。看起来也可以跨浏览器。是吗???
    • 您也可以通过 \t \n \r 和 \s+ 来拆分类,您的拆分非正则表达式不会考虑到这一点。
    • 在返回的末尾添加一个 trim() 以在函数多次使用时删除多余的空格(例如切换激活/停用状态)。
    【解决方案11】:

    尝试:

    function removeClassName(elem, name){
        var remClass = elem.className;
        var re = new RegExp('(^| )' + name + '( |$)');
        remClass = remClass.replace(re, '$1');
        remClass = remClass.replace(/ $/, '');
        elem.className = remClass;
    }
    

    【讨论】:

      猜你喜欢
      • 2014-06-17
      • 2011-01-04
      • 2011-02-18
      • 2012-04-15
      • 2016-05-19
      • 2011-01-01
      • 2019-05-09
      • 1970-01-01
      • 2020-06-26
      相关资源
      最近更新 更多