循环中的Javascript html dom元素数组
假设我有一个DOM元素数组:循环中的Javascript html dom元素数组,javascript,arrays,dom,for-in-loop,nodelist,Javascript,Arrays,Dom,For In Loop,Nodelist,假设我有一个DOM元素数组: var z = document.getElementsByClassName('name'); 对于我想为循环中的每个元素设置属性的元素: for(var n in z){z[n].setAttribute('marked', '1');} 对于上面的代码,我得到了z[n]。setAttibute不是一个函数。但是,当我手动签入z数组的控制台元素时,已将标记的属性添加到每个元素中。为什么会发生这种情况?我如何防止这种错误的发生 [].forEach.call(
var z = document.getElementsByClassName('name');
对于我想为循环中的每个元素设置属性的元素:
for(var n in z){z[n].setAttribute('marked', '1');}
对于上面的代码,我得到了z[n]。setAttibute不是一个函数。但是,当我手动签入z数组的控制台元素时,已将标记的属性添加到每个元素中。为什么会发生这种情况?我如何防止这种错误的发生
[].forEach.call(z, function(el) {
el.setAttribute('marked', '1');
})
for..in将获取HTMLCollection的所有键,包括属性.length。length是一个数字,没有.setAttribute函数。文档。GetElementsByCassName
返回类似数组的对象的实例for..in
循环是为对象而不是数组设计的。它遍历对象的所有属性。因此,在迭代HTMLCollection时,除了数组索引外,还可以获得其他属性,如length
。由于length
只是一个数字,因此它没有setAttribute
方法,因此您会得到该错误
您应该为
循环使用常规的,或为
循环的..使用:
const z = document.getElementsByClassName('name')
// Regular loop:
for (let i = 0, len = z.length; i < len; i++) {
z[i].setAttribute('marked', '1')
}
// for..of loop:
for (const element of z) {
element.setAttribute('marked', '1')
}
n是元素,不是索引,do n.setAttribute。对于类似数组的节点列表,您应该使用传统计数器,使用常规for循环可能更合适。请参阅getElementsByClassName
返回HTMLCollection
,而不是nodelist
。差异是相关的,因为DOM4创建了NodeList,所以您可以直接使用forEach
。
const z = Array.from(document.getElementsByClassName('name'))
z.forEach(element=> element.setAttribute('marked', '1'))