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

JavaScript中event listener重复添加引发性能问题的解决方案求助

JavaScript中event listener重复添加引发性能问题的解决方案求助

我现在遇到个头疼的问题——我的JavaScript代码里事件监听器被重复添加了好几次,导致应用越来越卡。

问题详情

我要给所有带.ag-header-cell-resize类的元素添加dblclick事件监听器,但每次组件更新或者页面重新渲染时,这个事件监听器就会重复绑定,而不是只绑一次。我目前的代码是这样的:

const resizeElements = document.querySelectorAll('.ag-header-cell-resize');

resizeElements.forEach((element) => {
    element.addEventListener('dblclick', (event) => {
        const parentHeaderCell = event.target?.closest('.ag-header-cell');
        if (parentHeaderCell) {
            const colId = parentHeaderCell.getAttribute('col-id');
            console.log('Column ID:', colId);

            const column = updateColumnWidth(tableColumns, colId);
            setTableColumns(column);
        }
    });
});

每次组件更新或者页面重渲染,新的监听器就会被加上,应用运行起来越来越慢。

我尝试过的解决方案

我已经试了几种办法,但都没解决问题:

  • 使用{ once: true }选项添加监听器:

    element.addEventListener('dblclick', eventHandler, { once: true });
    

    → 结果是每个元素只能触发一次事件,但我需要用户每次双击都能生效,不能只触发一次就失效了。

  • 添加前先移除监听器:
    → 这个方法没用,因为每次创建的事件处理函数引用都是不同的,根本无法移除旧的监听器。

  • 在React中使用useEffect(我用的是React框架):

    useEffect(() => {
      const resizeElements = document.querySelectorAll('.ag-header-cell-resize');
    
      resizeElements.forEach((element) => {
        element.addEventListener('dblclick', handleResize);
      });
    
      return () => {
        resizeElements.forEach((element) => {
          element.removeEventListener('dblclick', handleResize);
        });
      };
    }, []);
    
    // 之前试过的移除再添加的写法
    element.removeEventListener('dblclick', eventHandler);
    element.addEventListener('dblclick', eventHandler);
    

    → 就算加上了清理函数,监听器还是会重复绑定。

需要求助的问题

我现在需要大家帮忙解决的是:

  • 怎么才能确保每个元素只绑定一次这个事件监听器,不会重复添加?
  • 在JavaScript或者React里,有没有更好的方法来处理这类事件?

备注:内容来源于stack exchange,提问作者Mohit Rakh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 19:43:05