如何在所有元素上用另一个类替换一个类,仅使用DOM
How can I replace one class with another on all elements, using just the DOM?
我只是想将一个类名更改为另一个。
我试过使用
document.getElementsByClassName("current").setAttribute("class", "none");
但它不起作用。我是javascript新手
说明
document.getElementsByClassName
返回一个HTMLCollection
,而不仅仅是一个元素数组。这意味着集合是活动的,所以在这个特定的情况下,它保留了总是保存类为"current"的所有元素的要求。
巧合的是,您正在删除集合所依赖的class
,因此更新了集合。如果在循环中设置value
属性(例如),情况就完全不同了——集合不会受到影响,因为class
"current"没有被删除。如果您要添加类,例如el.className += " none";
,情况也会完全不同,但情况并非如此。
来自MDN文档的一个很好的描述:
HTML DOM中的HTMLCollections是活的;当基础文档发生更改时,它们将自动更新。
方法1
克服所有这些混乱的一个简单方法是向后循环。
var els = document.getElementsByClassName('current'),
i = els.length;
while (i--) {
els[i].className = 'none';
}
演示:http://jsfiddle.net/fAJgT/
(演示中的代码有一个setTimeout
,只是为了让您可以首先看到原始的边框颜色,然后在1.5秒后,看到它的变化)
这是有效的,因为它修改集合中的最后一项-当它被修改(并自动删除)时,移动到它之前的项。因此,它不会遭受自动删除的任何后果。
做同样事情的另一种设置是:
for (i = els.length; i >= 0; i--) {
方法2
另一个答案让我意识到你可以不断地对找到的第一个项目进行操作。当您删除特定的类时,元素也会从集合中删除,因此可以保证第一个项目始终是集合中的新项目。因此,检查length
属性应该是一个安全的检查条件。下面是一个例子:
var els = document.getElementsByClassName('current');
while (els.length) {
els[0].className = 'none';
}
演示:http://jsfiddle.net/EJLXe/
这基本上是说"当集合中仍然有项目时,修改第一个(修改后将被删除)"。但我真的不建议使用该方法,因为它只适用于,因为您最终会修改集合。如果没有删除特定的类,或者使用普通数组或非活动集合(没有splice
ing),则会产生无限循环。
方法3
另一种选择是将集合slice
(浅复制)到数组中并正常循环。但我看不出有任何理由/改进去做。这里有一个例子:
var els = document.getElementsByClassName('current'),
sliced = Array.prototype.slice.call(els), i;
for (i = 0; i < sliced.length; i++) {
sliced[i].className = 'none';
}
演示:http://jsfiddle.net/LHe95/2/
方法4
最后,您可以使用document.querySelector
-它返回一个非活动的NodeList
(因此您可以像正常一样循环),甚至在浏览器中比document.getElementsByClassName
有更好的支持。下面是一个例子:
var els = document.querySelectorAll('.current'),
i;
for (i = 0; i < els.length; i++) {
els[i].className = 'none';
}
演示:http://jsfiddle.net/xq8Xr/
引用:
-
document.getElementsByClassName
: https://developer.mozilla.org/en-US/docs/DOM/document.getElementsByClassName -
HTMLCollection
: https://developer.mozilla.org/en-US/docs/DOM/HTMLCollection -
slice
: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/slice -
querySelectorAll
: https://developer.mozilla.org/en-US/docs/DOM/Document.querySelectorAll
document.getElementsByClassName("current")
返回HTMLCollection
,而不是HTMLElement
。可以像访问数组一样访问列表中的元素。
下面的代码将改变HTMLCollection
中第一个元素的类。
document.getElementsByClassName("current")[0].setAttribute("class", "none");
但是,您不必使用setAttribute
方法,您可以设置元素的className
属性。
element.className = 'none';
请注意,HTMLCollection
是实时的,这意味着一旦元素不再具有current
类名,该元素将从数组中删除,因此为了避免任何问题,您可以使用以下方法迭代它:
var list = document.getElementsByClassName("current");
while (list.length) {
list[0].className = 'none';
}
- 窗口对象属性返回一个dom节点
- 是否可以将一个DOM元素转换为另一个?或者从中复制所有属性
- 使用 Aurelia动态创建一个 dom 对象
- 如何使用 ng 无限滚动并在 http.jsonp 完成后更新另一个 DOM 元素
- 从单独的 html 页面创建一个 dom 元素
- 获取下一个 DOM 元素的 ID
- 我有一个 DOM 节点如何获取其中的文本
- 获取列表中的第一个 DOM 元素
- 在 AngularJS 中成功的 http 请求上创建一个 DOM 元素
- 如何将一个dom元素附加到另一个dom元件中,但在jquery中的第一个位置
- 有没有一种方法可以创建一个DOM对象,给定其呈现的字符串
- 从字符串创建一个 DOM 文档,不带 JQuery
- 一次显示一个DOM元素的淡入/淡出列表
- Angular 指令在从一个 DOM 元素移动到另一个 DOM 元素后停止工作
- 如何获取在视口中可见的第一个DOM元素
- 选择当前元素之后的下一个DOM元素
- 如何交换第一个和最后一个DOM元素
- 渲染速度:一次添加一个DOM项或一次添加项集
- 另一个DOM元素的JavaScript虚拟/代理输入
- 如何检查某个DOM元素是否在另一个DOM元素树中