我想知道如何选择类名为“widget”和“hover”的所有元素,然后从这些元素中删除“hover”类。
我有以下JavaScript代码,用于选择“widget”和“hover”类的所有元素:
var elements = document.getElementsByClassName('widget hover');
console.log(elements);
这似乎工作并输出类似的东西(没有错误):
[div#.widget...
问题是,如果我尝试删除“hover”类,我会收到错误:
var elements = document.getElementsByClassName('widget hover');
console.log(elements);
elements.classList.remove("hover");
输出:
[item: function]
length: 0
Uncaught TypeError: Cannot call method 'remove' of undefined
谁能告诉我我做错了什么?
请注意我在jQuery中使用它:
$('.widget.hover').removeClass('hover');
...但我正在寻找纯JavaScript的解决方案。
答案 0 :(得分:64)
var elems = document.querySelectorAll(".widget.hover");
[].forEach.call(elems, function(el) {
el.classList.remove("hover");
});
您可以将.classList
修补到IE9中。否则,您需要修改.className
。
var elems = document.querySelectorAll(".widget.hover");
[].forEach.call(elems, function(el) {
el.className = el.className.replace(/\bhover\b/, "");
});
.forEach()
还需要IE8的补丁,但这仍然很常见。
答案 1 :(得分:13)
查找元素:
var elements = document.getElementsByClassName('widget hover');
由于elements
是live
数组且反映了所有dom更改,因此您可以使用简单的while循环删除所有hover
类:
while(elements.length > 0){
elements[0].classList.remove('hover');
}
答案 2 :(得分:8)
元素是DOM对象的数组。你应该做这样的事情
for (var i = 0; i < elements.length; i++) {
elements[i].classList.remove('hover');
}
ie:枚举元素集合,并为集合中的每个元素调用remove方法
答案 3 :(得分:5)
时间已经改变,现在最干净,最易读的方式是:
Array.from(document.getElementsByClassName('widget hover')).forEach((el) => el.classList.remove('hover'));
如果您不支持箭头功能,则只需将其转换为这样:
Array.from(document.getElementsByClassName('widget hover')).forEach(function(el) {
el.classList.remove('hover');
});
另外,如果您需要支持非常古老的浏览器,请对forEach
和Array.from
使用polyfil,然后继续生活。
答案 4 :(得分:3)
对于 ES6,这可以通过使用 one liners 的几种方式来完成,在这种情况下,您可以使用展开运算符 ...
创建一个元素数组,并使用 { 删除类{1}} 运算符:
使用map
:
querySelectorAll
使用[...document.querySelectorAll('.widget')].map(x => x.classList.remove('hover'));
:
getElementsByClassName
对于 [...document.getElementsByClassName('widget')].map(x => x.classList.remove('hover'));
,请注意使用 querySelectorAll
而不是 .widget
。扩展运算符的替代方法是使用 widget
如下:
Array.from
答案 5 :(得分:1)
这可能会有所帮助
let allElements = Array.from(document.querySelectorAll('.widget.hover'))
for (let element of allElements) {
element.classList.remove('hover')
}
答案 6 :(得分:0)
吉文为我工作。
document.querySelectorAll(".widget.hover").forEach(obj=>obj.classList.remove("hover"));
答案 7 :(得分:0)
var elems = document.querySelectorAll(".widget.hover");
for(let elem of elems){
elem.classList.remove('hover');
}
答案 8 :(得分:0)
我使用了一个简单的方法。 如果您始终在所需的循环次数中处理 [0],则可以将该处理应用于所有。
HTMLCollection(elements
) 实时变化,所以将长度放在一个变量中。 (l = element.length
)
for(var elements=document.getElementsByClassName('widget hover'),i=0,l=elements.length; l>i; i++) {
elements[0].classList.remove("hover");
}