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

Amr*_*mra 573 html javascript css

任何人都可以告诉我如何使用JavaScript删除元素上的类吗?请不要给我一个jQuery的答案,因为我不能使用它,我对此一无所知.

Pau*_*get 901

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

ELEMENT.classList.remove("CLASS_NAME");
Run Code Online (Sandbox Code Playgroud)

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

  • @dzhioev - 我相信因为它相对较新并且在旧版浏览器中不受支持(IE支持从IE10开始) (23认同)
  • 在MDN页面上,为旧版浏览器提供了一个垫片. (10认同)
  • 非常好!这比正则表达式简单得多,并将`className`拆分为部分并手动遍历它们. (6认同)
  • ELEMENT.classList既有'add'又有'remove',顺便说一句. (4认同)
  • FWIW,这适用于FF 7.0.1和Chromium 16.0.910.0 (2认同)
  • 这里最好的答案!如果需要在普通JS中执行此操作,则为JS添加最少的复杂性. (2认同)
  • 如果类不存在且函数不会抛出任何错误,为什么还要在调用 `.remove` 之前检查类是否存在呢?如果删除 if 语句,则 JavaScript 不必在每次为 true 时扫描类列表两次。 (2认同)

Яeg*_*ght 515

document.getElementById("MyID").className =
    document.getElementById("MyID").className.replace(/\bMyClass\b/,'');
Run Code Online (Sandbox Code Playgroud)

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


更新: 要支持包含短划线字符的类名,例如"My-Class",请使用

document.getElementById("MyID").className =
  document.getElementById("MyID").className
    .replace(new RegExp('(?:^|\\s)'+ 'My-Class' + '(?:\\s|$)'), ' ');
Run Code Online (Sandbox Code Playgroud)

  • 使用[字边界元字符`\ b`](http://www.regular-expressions.info/wordboundaries.html)不适用于此,因为字边界也出现在单词字符`[A-Za]之间-z0-9_]`和破折号`-`字符.因此,类名称例如*'different-MyClass'*也将被替换,导致*'不同 - '*.有一个更好的解决方案[匹配类名称周围的空白字符](http://stackoverflow.com/a/9959811/686534). (54认同)
  • 如果我错了,请纠正我,但我认为关于`replace`的第一个参数必须是正则表达式,所以不要用引号括起来:`.replace(/\bMyClass\b /,'')`.但是'MyClass'必须是一个文字,否则也许创建正则表达式可以起作用:`.replace(new RegExp('\\ b'+ myClass +'\\ b'),'')` (13认同)
  • @PauFracés查看编辑历史记录.其他人引入了不一致. (3认同)
  • 我也删除了一个空格,如果它在那里:`domNode.className.replace(new RegExp("?\\ b"+ cssClass +"\\ b"),'')` (2认同)

Mat*_*hew 56

这是一种将此功能直接烘焙到所有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;
}
Run Code Online (Sandbox Code Playgroud)

  • 添加一个if包装器[if(typeof HTMLElement.prototype.removeClass!=="function"){],以便在以后浏览器添加对removeClass的支持时使这个答案最优雅. (4认同)
  • 非常优雅,最适用于这个问题. (3认同)
  • 在返回结束时添加trim()以在多次使用函数时删除冗余空格(例如切换激活/取消激活状态). (2认同)

Kei*_*eau 41

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,' ');
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • `el.className.replace(/(\ s | ^)someclass(\ s | $)/,'')`如果您不想创建辅助函数.:) (2认同)

jos*_*ela 35

div.classList.add("foo");
div.classList.remove("foo");
Run Code Online (Sandbox Code Playgroud)

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

  • 好的,太糟糕的支持从IE 10和Android 3开始.为什么他们10年前没有对这些东西进行编码? (6认同)
  • @Andrew 说实话,整个网络技术世界看起来就像一大堆想法拼凑在一起,没有系统或一致性...... (2认同)

Dun*_*can 27

编辑

好的,完全重写.已经有一段时间了,我已经学到了一点,这些评论也有所帮助.

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;
};
Run Code Online (Sandbox Code Playgroud)


老邮政
我只是在做这样的事情.这是我提出的解决方案......

// 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
});
Run Code Online (Sandbox Code Playgroud)

现在你可以打电话了 myElement.removeClass('myClass')

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

  • 我在这里已经很晚了,但是我有一个例子,它不起作用:考虑一个包含类testClass和testClass2的元素.(class ="testClass testClass2")我们希望从元素中删除testClass.结果使用您的方法:class ="2"这就是为什么将它分成一个数组是有利的.当然,使用纯字符串操作仍然可以实现正确的结果,但它变得更加复杂.如果你不想要乱七八糟的代码,你需要使用正则表达式.使用数组的优点是代码易于阅读. (2认同)

小智 17

我想这很简单.

document.getElementById("whatever").classList.remove("className");
Run Code Online (Sandbox Code Playgroud)

  • 这具有较差的跨浏览器支持.Internet Explorer在10之前的任何版本中都不支持它.https://developer.mozilla.org/en-US/docs/Web/API/element.classList#Browser_compatibility (7认同)
  • @ShannonPoole有时您只需要以IE8兼容的方式执行一项简单的任务,并且您不希望它依赖于库支持或重型polyfill. (3认同)
  • 这对我来说似乎是正确的答案.如果您担心跨浏览器使用polyfill.https://github.com/eligrey/classList.js (2认同)
  • @acjay,有时你会谨慎对待风,只需遵循现代标准:) (2认同)

scu*_*ffe 9

尝试:

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


小智 5

var element = document.getElementById('example_id');
var remove_class = 'example_class';

element.className = element.className.replace(' ' + remove_class, '').replace(remove_class, '');
Run Code Online (Sandbox Code Playgroud)