js如何循环HTMLCollection

场景

当使用document.getElementsByClassName方法获取一个包含DOM节点的集合arr时,正常的forEach和map操作都会报一个arr.map is not a function的错误

因为这里的arr并不是标准的 数组 (Array),而是一个 HTMLCollection

解决

  1. 使用document.querySelectorAll获取节点列表
  2. 转为数组
bash 复制代码
Array.from(arr).forEach(v => {
  v.childNodes[0].style.display = 'none';
});
  1. 扩展运算符
bash 复制代码
[...arr].forEach(v => {
  v.childNodes[0].style.display = 'none';
});
  1. 用传统 for 循环
bash 复制代码
for (let i = 0; i < arr.length; i++) {
  arr[i].childNodes[0].style.display = 'none';
}

拓展

  1. 这是一个右击出现弹窗的事件,每个节点都对应一个弹窗,可左键一键清空
bash 复制代码
handleRightClickPoint(index, e){
  e.preventDefault();
  let t = document.getElementsByClassName('hangdian-right')
  let totalnodes = t[index].childNodes
  totalnodes[0].style.display = 'block';
  totalnodes[0].style.left = (e.clientX + 18) + 'px';
  totalnodes[0].style.top = (e.clientY - 5) + 'px';
  totalnodes[0].onclick = function() {
    totalnodes[0].style.display = 'none';
  };
  document.onclick = function() {
    [...t].forEach(v=>{
      v.childNodes[0].style.display = 'none';
    })
  };
},
相关推荐
前端摸鱼匠11 分钟前
Vue 3 的v-bind合并行为:讲解v-bind与普通属性合并的规则
前端·javascript·vue.js·前端框架·ecmascript
REDcker32 分钟前
浏览器端Web程序性能分析与优化实战 DevTools指标与工程清单
开发语言·前端·javascript·vue·ecmascript·php·js
Linsk2 小时前
Java和JavaScript的关系真是雷峰和雷峰塔的关系吗?
java·javascript·oracle
当时只道寻常2 小时前
浏览器文本复制到剪贴板:企业级最佳实践
javascript
Alice-YUE3 小时前
【js高频八股】防抖与节流
开发语言·前端·javascript·笔记·学习·ecmascript
是上好佳佳佳呀5 小时前
【前端(十一)】JavaScript 语法基础笔记(多语言对比)
前端·javascript·笔记
莎士比亚的文学花园5 小时前
Linux驱动开发(3)——设备树
开发语言·javascript·ecmascript
01漫游者6 小时前
JavaScript函数与对象增强知识
开发语言·javascript·ecmascript
threelab7 小时前
Three.js 代码云效果 | 三维可视化 / AI 提示词
开发语言·javascript·人工智能
yqcoder9 小时前
JavaScript 柯里化:把“大餐”拆成“小炒”的艺术
开发语言·javascript·ecmascript