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

Window scroll事件中click监听器重复触发问题如何解决

问题根因
  • scroll事件在页面滚动时会高频触发,你将click事件绑定逻辑放在scroll回调内,每次滚动都会给所有匹配[data-config-url]的元素重复叠加绑定相同的click监听器
  • 单个元素上累计绑定了多个重复的click回调,点击时所有回调依次执行,就会出现多次打印configData的现象
推荐修复方案(事件委托)

无需将绑定逻辑放在scroll回调中,仅需全局绑定一次事件委托即可,不会出现重复绑定问题,还能自动覆盖后续动态加载的匹配元素,性能更好:

// 页面加载后执行一次即可
document.addEventListener('click', (e) => {
  const targetItem = e.target.closest('[data-config-url]');
  if (targetItem) {
    const configData = targetItem.getAttribute('data-config-url');
    console.log(configData);
  }
});
兼容原有逻辑的修复方案

如果需要保留在scroll中绑定事件的逻辑,可给已绑定事件的元素添加标记,避免重复绑定:

window.addEventListener("scroll", () => {
  // 只选中还未绑定过click事件的元素
  const config = document.querySelectorAll("[data-config-url]:not([data-click-bound])");
  config.forEach((item) => {
    // 标记为已绑定,后续滚动查询时会跳过该元素
    item.setAttribute('data-click-bound', 'true');
    item.addEventListener("click", (e) => {
      const configData = e.currentTarget.getAttribute("data-config-url");           
      console.log(configData);
    });
  });
});

该方案会在每次scroll触发时执行DOM查询,性能弱于事件委托方案,非特殊场景不推荐使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 00:01:05