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

jQuery嵌套点击函数重复触发问题求助

重复触发点击事件的问题分析与解决

问题根源

每次点击btn1时,你都会执行$(".btn2").click(...)——这意味着所有已存在的.btn2按钮都会被重复绑定一次点击事件。第一次点击btn1,生成的第一个.btn2被绑定1次事件;第二次点击btn1,新生成的.btn2被绑定1次,同时旧的.btn2又被多绑定1次。此时点击.btn2,两个事件回调会同时执行,所以<i>After</i>会被输出两次,点击次数越多,触发次数越多。

解决方案

下面提供几种实用的解决方式,按需选择:

1. 只给新添加的.btn2绑定事件(精准绑定)

修改btn1的点击逻辑,直接给刚插入的按钮绑定事件,避免全局选择所有.btn2:

$(document).ready(function(){
  $("#btn1").click(function(){
    // 链式操作,仅为本次新增的.btn2绑定事件
    $("<b>Before</b><button class='btn2'>Insert after</button>")
      .insertBefore("#check")
      .filter(".btn2")
      .click(function(){
        $("#check").after("<i>After</i>");
      });
  });
});

2. 事件委托(推荐,性能最优)

利用事件冒泡原理,把点击事件绑定到静态父元素(比如body,或者更接近的容器),后续动态生成的.btn2都会自动触发事件,且仅绑定一次:

$(document).ready(function(){
  $("#btn1").click(function(){
    $("#check").before("<b>Before</b><button class='btn2'>Insert after</button>");
  });
  
  // 事件委托:父元素监听子元素的点击事件
  $("body").on("click", ".btn2", function(){
    $("#check").after("<i>After</i>");
  });
});

3. 绑定前移除旧事件(兼容原有写法)

如果不想改动太多原有逻辑,可以在绑定新事件前,先移除.btn2上已有的点击事件,避免叠加:

$(document).ready(function(){
  $("#btn1").click(function(){
    $("#check").before("<b>Before</b><button class='btn2'>Insert after</button>");
    // 先解绑所有点击事件,再重新绑定
    $(".btn2").off("click").click(function(){
      $("#check").after("<i>After</i>");
    });
  });
});

4. 避免重复生成.btn2(从源头解决)

每次点击btn1时,先移除之前添加的内容,保证页面始终只有一个.btn2:

$(document).ready(function(){
  $("#btn1").click(function(){
    // 清除之前添加的Before文本和.btn2按钮
    $("#check").prevAll("b, .btn2").remove();
    $("#check").before("<b>Before</b><button class='btn2'>Insert after</button>");
    $(".btn2").click(function(){
      $("#check").after("<i>After</i>");
    });
  });
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 01:50:32