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

Bootstrap切换按钮Ajax失败时回退状态避免循环方案问询

解决Bootstrap切换按钮Ajax错误时的循环回退问题

你遇到的循环问题根源很明确:在error回调里调用$('#toggle-verify-mobile').click()会再次触发按钮的点击事件,而这个事件又会重新发起Ajax请求,如此往复就陷入了无限循环。

正确的做法是直接手动恢复按钮的初始状态,而不是模拟点击操作——毕竟Bootstrap的切换按钮状态本质上就是靠active类和aria-pressed属性来控制的,我们直接修改这些即可,不需要触发事件。

修正后的jQuery代码

$(function() {
  $("#toggle-verify-mobile").on("click", function(event) {
    event.preventDefault();
    $('#toggle-verify-mobile-error').html('<br/>')
    var $btn = $(this); // 缓存按钮元素,避免重复DOM查询
    var csrf = $('input[name="csrfmiddlewaretoken"]').val();
    var current_state = $btn.hasClass('active');
    
    // 可选:请求期间禁用按钮,防止重复点击
    $btn.prop('disabled', true);

    $.ajax({
      type: "POST",
      url: "{% url 'my_app:ajax_skip_mobile_verification' %}",
      data: {
        'current_state': current_state,
        'csrfmiddlewaretoken': csrf
      },
      dataType: 'json',
      success: function (data) {
        // Success stuff here
      },
      error: function(xhr, textStatus, errorThrown){
        // 直接恢复初始状态,不触发点击事件
        if (current_state) {
          // 初始状态是active,回退时保留active类和aria-pressed=true
          $btn.addClass("active").attr("aria-pressed", "true");
        } else {
          // 初始状态不是active,回退时移除类并设置aria-pressed=false
          $btn.removeClass("active").attr("aria-pressed", "false");
        }
        // 可选:添加明确的错误提示
        $('#toggle-verify-mobile-error').html('<br/>请求失败,请检查网络连接后重试');
      },
      complete: function() {
        // 请求完成(无论成功失败)重新启用按钮
        $btn.prop('disabled', false);
      }
    });
  });
});

关键改动说明

  • 缓存按钮元素:用$btn变量存储$(this),减少重复DOM查询,提升性能。
  • 直接修改状态属性:在error回调里直接操作active类和aria-pressed属性,完全避免触发点击事件,从根源上解决循环问题。
  • 添加按钮禁用逻辑:请求发起时禁用按钮,完成后恢复,防止用户在请求未结束时重复点击,进一步避免意外问题。
  • 优化错误提示:在错误回调里添加用户友好的提示,提升交互体验。

这样修改后,当Ajax请求失败时,按钮会直接回退到初始状态,不会触发新的请求,完美解决循环问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:02:23