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

Ajax请求成功后表单无法自动提交至指定URL的问题求助

问题:Ajax请求成功后表单无法自动提交

现有表单:

<form id="form_check" action="/orders/place_order/" method="POST" enctype="multipart/form-data">

点击提交按钮时,需求是先通过Ajax把表单数据提交到/accounts/edit_profile/保存为默认地址,等Ajax请求成功后,自动将表单提交到/orders/place_order/完成下单。但目前Ajax请求成功后,表单并未自动提交,必须手动点击提交按钮才能完成最终提交。

现有代码

var frm = $('#form_check');
frm.submit(function() {
  var r = confirm("Would you like to save this address as default address?");
  if (r == true) {
    $.ajax({
      type: frm.attr('method'),
      url: '/accounts/edit_profile/',
      data: frm.serialize(),
      success: function (data) {
        frm.submit();
      }
    });
  } else {
    // 用户不同意时的逻辑
  }
  return false;
});

问题根因

你在表单的submit事件回调末尾返回了false,这会阻止表单的默认提交行为。而当Ajax成功后调用frm.submit()时,会再次触发你绑定的submit事件,回调又会执行一遍并返回false,相当于又把提交行为阻止了,所以表单根本没提交。

解决方案

方案1:调用原生DOM的submit方法

直接操作表单的原生DOM元素调用submit(),这个方法不会触发jQuery绑定的submit事件,能直接提交表单:

var frm = $('#form_check');
frm.submit(function() {
  var r = confirm("是否要将此地址保存为默认地址?");
  if (r == true) {
    $.ajax({
      type: frm.attr('method'),
      url: '/accounts/edit_profile/',
      data: frm.serialize(),
      success: function (data) {
        // 调用原生submit方法
        frm[0].submit();
      }
    });
  } else {
    // 用户不同意,直接提交表单
    return true;
  }
  return false;
});

方案2:解绑事件后再提交

在Ajax成功回调里,先解除之前绑定的submit事件,再调用提交:

var frm = $('#form_check');
frm.submit(function() {
  var r = confirm("是否要将此地址保存为默认地址?");
  if (r == true) {
    $.ajax({
      type: frm.attr('method'),
      url: '/accounts/edit_profile/',
      data: frm.serialize(),
      success: function (data) {
        // 解绑事件后提交
        frm.off('submit').submit();
      }
    });
  } else {
    return true;
  }
  return false;
});

方案3:添加标记区分提交类型

设置一个变量标记是否是自动提交,在回调里判断标记决定是否阻止默认行为:

var frm = $('#form_check');
var isAutoSubmit = false;

frm.submit(function() {
  if (isAutoSubmit) {
    // 自动提交,放行
    return true;
  }

  var r = confirm("是否要将此地址保存为默认地址?");
  if (r == true) {
    $.ajax({
      type: frm.attr('method'),
      url: '/accounts/edit_profile/',
      data: frm.serialize(),
      success: function (data) {
        isAutoSubmit = true;
        frm.submit();
      }
    });
  } else {
    // 用户不同意,直接提交
    return true;
  }
  return false;
});

额外注意事项

你的表单设置了enctype="multipart/form-data",如果表单包含文件上传控件,frm.serialize()不会包含文件数据,此时Ajax提交需要用FormData处理,修改Ajax部分代码:

$.ajax({
  type: frm.attr('method'),
  url: '/accounts/edit_profile/',
  data: new FormData(frm[0]), // 使用FormData
  processData: false, // 禁止jQuery处理数据
  contentType: false, // 禁止jQuery设置Content-Type
  success: function (data) {
    frm[0].submit();
  }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 11:55:38