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

JQuery按钮点击事件重复触发(Alert次数递增)求助

解决jQuery点击事件触发次数递增的问题

看起来你踩了重复绑定事件监听的坑,这也是新手用jQuery时很容易犯的错误,我来帮你拆解问题并给出修复方案:

问题根源

你的hi()函数每次被按钮点击调用时,都会执行$('button').on('click', ...)——这相当于给页面上所有按钮再添加一次点击事件处理函数。第一次点击后,按钮绑定了1个处理函数;第二次点击时,之前的1个加上新绑定的1个,总共触发2次;第三次就会触发3次,以此类推,弹出次数自然越来越多。

另外,$(document).ready()在页面加载完成后就已经执行过了,把它放在hi()函数里完全没有意义,只会在第一次调用hi时执行里面的绑定逻辑,之后只会重复执行事件绑定的代码。

修复方案

我们要把事件绑定逻辑从hi()里抽出来,让它只在页面加载完成时执行一次;同时去掉按钮上的onclick属性,直接通过事件监听获取按钮的data数据:

修正后的jQuery代码

<script>
// 页面加载完成后,只绑定一次点击事件
$(document).ready(function() {
  $('button.btn-danger').on('click', function() {
    const $btn = $(this);
    // 获取按钮的data属性数据
    const id = $btn.data('id');
    const manjarData = $btn.data('manjar');
    
    console.log(id, $btn[0].dataset.id, manjarData);
    alert("It is done once!");
  });
});
</script>

修正后的PHP代码

$i = 0;
foreach($arr as $data ){
  $iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($data), RecursiveIteratorIterator::SELF_FIRST);
  $find_variables = iterator_to_array($iterator,true);
  
  foreach($find_variables as $rec){
    if (is_array($rec) && !empty($rec) && $rec['text'] != '') {
      $manjar = json_encode($rec);
      $manj1 = htmlspecialchars($manjar , ENT_QUOTES);
      // 移除onclick属性,把额外数据存在data-manjar里,同时修正混乱的HTML标签结构
      echo '<tr><td><div id="my-div3"><button class="btn btn-danger" type="button" data-id="'.$i.'" data-manjar="'.$manj1.'">Info</button></div></td></tr>';
      $i++;
    }
  }
}

额外说明

原PHP代码里的HTML标签有嵌套错误(比如无开头的</a>、混乱的<td>闭合),我在修正时一并调整了,确保HTML结构合法——这也能避免一些潜在的DOM解析问题。

这样修改后,每个按钮的点击事件只会绑定一次,每次点击只会触发一次alert,不会再出现次数递增的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:06:14