如何从纯JavaScript中的元素中删除一个类?

And*_*rew 54 javascript getelementsbyclassname

我想知道如何选择类名为"widget"和"hover"的所有元素,然后从这些元素中删除类"hover".

我有以下JavaScript代码,用于选择类"widget"和"hover"的所有元素:

var elements = document.getElementsByClassName('widget hover');
console.log(elements);
Run Code Online (Sandbox Code Playgroud)

这似乎工作并输出这样的东西(没有错误):

[div#.widget... 
Run Code Online (Sandbox Code Playgroud)

问题是,如果我尝试删除类"悬停",我收到一个错误:

var elements = document.getElementsByClassName('widget hover');
console.log(elements);
elements.classList.remove("hover");
Run Code Online (Sandbox Code Playgroud)

这输出:

[item: function]
length: 0
Uncaught TypeError: Cannot call method 'remove' of undefined 
Run Code Online (Sandbox Code Playgroud)

谁能告诉我我做错了什么?


请注意我在jQuery中使用它:

$('.widget.hover').removeClass('hover');
Run Code Online (Sandbox Code Playgroud)

...但我正在寻找纯JavaScript的解决方案.

coo*_*ter 79

var elems = document.querySelectorAll(".widget.hover");

[].forEach.call(elems, function(el) {
    el.classList.remove("hover");
});
Run Code Online (Sandbox Code Playgroud)

你可以修补.classList到IE9.否则,你需要修改.className.

var elems = document.querySelectorAll(".widget.hover");

[].forEach.call(elems, function(el) {
    el.className = el.className.replace(/\bhover\b/, "");
});
Run Code Online (Sandbox Code Playgroud)

.forEach()还需要IE8的补丁,但是这是很常见的反正.


max*_*uty 27

现在是 2021 年...保持简单,只需使用 es6

时代变了,现在最干净、最易读的方法是:

Array.from(document.querySelectorAll('.widget.hover')).forEach((el) => el.classList.remove('hover'));
Run Code Online (Sandbox Code Playgroud)

如果您不能支持箭头函数,那么只需将其转换为:

Array.from(document.querySelectorAll('.widget.hover')).forEach(function(el) { 
    el.classList.remove('hover');
});
Run Code Online (Sandbox Code Playgroud)

此外,如果您需要支持非常旧的浏览器,然后用polyfilforEachArray.from与您的生活。

  • @Danie - 这仍然有效,两者之间的区别在于,一个引用“NodeList[]”,而“Array.from”引用“Array[]”,[有关更多信息,请参阅此文章](https:/ /attacomsian.com/blog/javascript-nodelist-vs-array#:~:text=an%20array%20discussion%3A%20a%20NodeList、prototypes%2C%20methods%2C%20and%20properties。)。 (2认同)

Vei*_*kko 18

查找元素:

var elements = document.getElementsByClassName('widget hover');
Run Code Online (Sandbox Code Playgroud)

由于elements是一个live数组并反映了所有dom更改,您可以hover使用简单的while循环删除所有类:

while(elements.length > 0){
    elements[0].classList.remove('hover');
}
Run Code Online (Sandbox Code Playgroud)


nem*_*emo 9

elements是一个DOM对象数组.你应该做这样的事情

for (var i = 0; i < elements.length; i++) {
   elements[i].classList.remove('hover');
}
Run Code Online (Sandbox Code Playgroud)

ie:枚举元素集合,并为集合内的每个元素调用remove方法

  • 需要考虑的一件事是,在问题中,`.getElementsByClassName`被用来获取元素.因为您要删除用于获取的其中一个类,所以该元素将从`elements`列表中删除,这意味着该列表会被重新编入索引,并最终跳过某些元素.反向迭代更安全. (8认同)
  • ...这是一个说明问题的演示.http://jsfiddle.net/mG8NP/ (4认同)
  • 基于@cookiemonster的观点,这是递归版本:`for (var i = elements.length-1; i &gt; -1; i--) {}`。 (2认同)

Kur*_*den 8

对于 ES6,这可以通过oneliners通过几种方式来完成,您可以使用展开运算符创建一个元素数组...,并使用该运算符删除该类map

querySelectorAll

[...document.querySelectorAll('.widget')].map(x => x.classList.remove('hover'));
Run Code Online (Sandbox Code Playgroud)

getElementsByClassName

[...document.getElementsByClassName('widget')].map(x => x.classList.remove('hover'));
Run Code Online (Sandbox Code Playgroud)

对于querySelectorAll,请注意使用.widget代替widget。扩展运算符的另一种选择是使用Array.from

Array.from(document.querySelectorAll('.widget')).map(x => x.classList.remove('hover'));
Run Code Online (Sandbox Code Playgroud)


小智 5

这可能有帮助:

let allElements = Array.from(document.querySelectorAll('.widget.hover'));
for (let element of allElements) {
  element.classList.remove('hover');
}
Run Code Online (Sandbox Code Playgroud)