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

解决Click Me按钮重复绑定事件导致多次弹出Alert的问题

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

问题核心在于:每次点击Click Me 1时,都会给Click Me 2按钮追加新的点击事件处理函数,多次点击后事件会叠加,导致点击Click Me 2时触发所有积累的事件。下面提供两种可行的解决方式:

方式一:绑定新事件前先解绑旧事件

在为.popup_btn绑定新的点击事件前,先通过.off('click')清除所有已绑定的点击事件,确保每次只有一个生效的点击事件:

$(".get_nubmers_btn").on("click", function() {
  var v_chk_txtbox = $(".numbers_input").val().trim();
  // 先清除popup_btn上所有已绑定的click事件
  $(".popup_btn").off('click');
  
  if (v_chk_txtbox.length != "") {
    $(".popup_btn").addClass("foo").removeClass("bar");
    $(".popup_btn").click(function() {
      alert(v_chk_txtbox);
    });
  } else {
    $(".popup_btn").addClass("bar").removeClass("foo");
    $(".popup_btn").click(function() {
      alert("input an number");
    });
  }
});

这里还优化了DOM查询:直接使用已获取的v_chk_txtbox变量,避免重复读取输入框值。

方式二:只绑定一次事件,根据状态执行逻辑

更高效的方式是给Click Me 2只绑定一次点击事件,在事件内部根据当前输入框的状态执行对应逻辑,完全避免重复绑定的问题:

// 一次性绑定Click Me 2的点击事件,仅执行一次
$(".popup_btn").on("click", function() {
  var v_chk_txtbox = $(".numbers_input").val().trim();
  if (v_chk_txtbox) {
    alert(v_chk_txtbox);
  } else {
    alert("input an number");
  }
});

// Click Me 1仅负责更新按钮样式状态
$(".get_nubmers_btn").on("click", function() {
  var v_chk_txtbox = $(".numbers_input").val().trim();
  $(".popup_btn").toggleClass("foo", !!v_chk_txtbox).toggleClass("bar", !v_chk_txtbox);
});

这种方式性能更好,逻辑更清晰:Click Me 1仅处理样式切换,Click Me 2的点击逻辑固定,无需每次重新绑定。

完整代码示例(方式二)

HTML

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="https://code.jquery.com/jquery-3.7.0.min.js"></script>
  <style>
    div.messagebox {
      background-color: lightgray;
      padding: 10px 10px;
    }
  </style>
</head>
<body>
  <input type="number" placeholder="insert number" class="numbers_input">
  <button type="button" class="get_nubmers_btn">Click Me 1</button>
  <hr>
  <div class="messagebox">
    <p>Messagebox</p>
    <button type="button" class="popup_btn">Click Me 2</button>
  </div>
</body>
</html>

JavaScript

$(".popup_btn").on("click", function() {
  var v_chk_txtbox = $(".numbers_input").val().trim();
  if (v_chk_txtbox) {
    alert(v_chk_txtbox);
  } else {
    alert("input an number");
  }
});

$(".get_nubmers_btn").on("click", function() {
  var v_chk_txtbox = $(".numbers_input").val().trim();
  $(".popup_btn").toggleClass("foo", !!v_chk_txtbox).toggleClass("bar", !v_chk_txtbox);
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 23:55:25