循环中的Javascript html 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(

假设我有一个DOM元素数组:

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'))