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

for...in循环使用addEventListener报key.addEventListener不是函数怎么办

错误原因

for...in遍历普通对象时,循环拿到的key是对象的属性名字符串,不是你提前声明的DOM元素变量。
你的代码里第一次循环拿到的key是字符串"firstBtn",第二次是字符串"secondBtn",字符串类型不存在addEventListener方法,所以会抛出key.addEventListener is not a function的报错。

修正方法

方案1:映射表统一存储DOM和对应逻辑

不要把DOM元素拆成单独变量声明,直接把DOM节点、点击后要触发的逻辑统一存在映射对象里,遍历的时候直接取对应的DOM节点即可:

// 统一存储按钮DOM和对应输出内容的映射
const btnConfig = {
  firstBtn: {
    el: document.querySelector('.first-btn'),
    logVal: 'apple'
  },
  secondBtn: {
    el: document.querySelector('.second-btn'),
    logVal: 'orange'
  }
};

for (const key in btnConfig) {
  const currentBtn = btnConfig[key].el;
  currentBtn.addEventListener('click', () => {
    console.log(btnConfig[key].logVal);
  });
}

对应的HTML不需要改动:

<button class="first-btn">First</button>
<button class="second-btn">Second</button>

方案2:公共类批量获取+自定义属性传参(推荐,冗余代码最少)

如果需要绑定事件的按钮数量多,不用手动写一一对应的映射,给所有需要绑定事件的按钮加统一类名,用document.querySelectorAll一次性获取所有节点,再通过data-*自定义属性存每个按钮对应的参数即可:
修改后的HTML:

<button class="log-btn" data-log="apple">First</button>
<button class="log-btn" data-log="orange">Second</button>

对应的JS代码:

// 一次性获取所有需要绑定点击事件的按钮
const btnList = document.querySelectorAll('.log-btn');
btnList.forEach(btn => {
  btn.addEventListener('click', () => {
    console.log(btn.dataset.log);
  });
});

后续新增按钮只需要加log-btn类和对应data-log属性,不需要改JS逻辑,扩展性更好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 01:42:18