You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么循环内获取data-attribute属性功能正常但仍抛出报错?

问题原因

document.getElementsByClassName() 返回的是HTMLCollection类数组对象,不是普通数组。你用for...in遍历的时候,除了遍历到集合里的3个input元素,还会遍历到HTMLCollection自带的属性和方法(比如length、item()、namedItem()),这些非元素的值访问dataset属性自然会抛出报错。
因为前3次遍历刚好对应3个有效input元素,值都被正确重置了,后续遍历触发的报错不影响已经执行完成的逻辑,所以功能看起来是正常的。

修复方案

任选以下任意一种方案修改即可:

方法1:用for...of遍历HTMLCollection

写法最简洁,直接遍历集合里的元素项,不会遍历到额外属性:

function reset() {
  for (const person of people) {
    person.value = person.dataset.name
  }
}

方法2:转成数组后用forEach遍历

把HTMLCollection转成普通数组,再用数组的遍历方法执行逻辑:

function reset() {
  Array.from(people).forEach(person => {
    person.value = person.dataset.name
  })
}

方法3:使用传统索引for循环

通过下标访问集合内的元素,规避额外属性的遍历:

function reset() {
  for (let i = 0; i < people.length; i++) {
    people[i].value = people[i].dataset.name
  }
}

内容的提问来源于stack exchange,提问作者Adam Scot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 00:45:04