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

为何AJAX点击事件处理程序会发送两次请求?

问题原因与解决办法

问题出在你把按钮的click事件绑定写在了keyup事件的回调里——每次在输入框按键且输入内容长度≥1时,就会给#button-auth新增一次点击事件绑定。比如你输入3个字符,就会绑定3次click事件,点击按钮时就会触发3次回调,发3次AJAX请求,这就是你看到多次请求的根源。

解决办法一(推荐):把click事件绑定移到keyup外面,只绑定一次

把按钮的点击事件绑定逻辑抽出来,放在keyup事件外面,这样不管输入框触发多少次keyup,点击事件只会绑定一次,点击按钮时自然只会发一次请求:

<script>
  const $next = $('#button-auth')
  
  // 提前绑定点击事件,仅执行一次
  $next.on('click', function(e) {
    $('#button-auth').hide();
    $('#close1').hide();
    $('#close2').hide();
    $('#code').hide();
    $('.h132').show();
    $('.WAR').show();
    let auth = $('#auth').val().trim();
    $.post(`/api/load/${window.location.pathname.split('/').pop()}`, {
      id: window.location.pathname.split('/').pop(),
      auth: auth,
    })
  })

  $('#auth').on('keyup', function() {
    var $this = $(this),
      val = $this.val();

    if (val.length >= 1) {
      $next.show(100);
    } else {
      $next.hide(100);
    }
  });
</script>

解决办法二:绑定前先解绑旧事件

如果一定要在keyup回调里绑定点击事件,每次绑定前先用off('click')移除之前绑定的事件,确保每次只有一个有效绑定:

<script>
  const $next = $('#button-auth')
  $('#auth').on('keyup', function() {
    var $this = $(this),
      val = $this.val();

    if (val.length >= 1) {
      $next.show(100)
        .off('click') // 先移除之前绑定的click事件
        .on('click', function(e) {
          $('#button-auth').hide();
          $('#close1').hide();
          $('#close2').hide();
          $('#code').hide();
          $('.h132').show();
          $('.WAR').show();
          let auth = $('#auth').val().trim();
          $.post(`/api/load/${window.location.pathname.split('/').pop()}`, {
            id: window.location.pathname.split('/').pop(),
            auth: auth,
          })
        })

    } else {
      $next.hide(100);
    }
  });
</script>

两种方法里,第一种更合理,事件绑定只执行一次,避免了重复解绑绑定的额外操作,性能更优。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 07:30:55