Ajax jQuery提交事件函数返回值

Ajax jQuery提交事件函数返回值,ajax,forms,jquery,Ajax,Forms,Jquery,我有一个函数挂接在$('form').submit()事件上 此函数将触发ajax请求并更新文档 我希望这样,如果出现ajax错误,表单将继续正常提交。这可能吗 我尝试了返回失败\u状态在函数末尾(fail_status是一个布尔变量,在ajax“error”函数中更新为“true”),但它似乎不起作用 代码如下所示: $('form').submit(function(){ var fail_status = false; $.ajax( ... error: fun

我有一个函数挂接在
$('form').submit()事件上

此函数将触发ajax请求并更新文档

我希望这样,如果出现ajax错误,表单将继续正常提交。这可能吗

我尝试了
返回失败\u状态在函数末尾(fail_status是一个布尔变量,在ajax“error”函数中更新为“true”),但它似乎不起作用

代码如下所示:

$('form').submit(function(){
  var fail_status = false;

  $.ajax(

   ...

   error: function(){
     fail_status = true;
   }

   ...

  );

  return fail_status;
  // so if it's true the form should be submitted normally...
});

问题在于AJAX是异步的。因此,
submit
函数在ajax调用失败之前完成。所以你返回的是假的

除非使AJAX调用同步,否则您将无法按现有方式执行此操作。这通常不是一个好主意,因为发送请求时浏览器将挂起


我看到的唯一其他选项是从error函数中提交表单。

您可以将事件分开:

$('#formSubmitButton').click(function(e){
    e.preventDefault();
    $.ajax({
        // do ajax stuff here
        complete: function(){
            $('#myform').submit();
        }
    });

});

complete
对成功或失败的ajax响应没有偏见,只要服务器有响应。如果您只想在ajax错误中提交表单,您应该将提交事件放在
error
方法中。

问题在于JQuery默认为异步。这意味着它在得到服务器响应之前返回“fail_status”

您最好的选择是让
error:
成为以编程方式提交表单的函数

error: function(){$('#myform').submit();}
编辑:尝试重写函数:

$('form').submit(function(retry){
    if(!retry){
        //do ajax
        error:function(){
              $('form').submit(true);
        }
    }
    return retry;
})

您要么使用同步AJAX请求(不推荐!),要么使用下面的代码

其背后的理念是:

  • 如果
    fail\u status==false
    ,则继续执行该功能(默认)
  • 使用
    ev.preventDefault()
    取消表单提交。设置
    ajax\u请求\u请求=true
  • 启动AJAX调用
  • 成功时:设置
    ajax\u request\u made=false
    ,以启用新表单提交
  • 失败时:设置
    ajax\u request\u make=false
    ,以启用新表单提交,
    并设置
    fail\u status=true
    。再次调用submit函数。由于此变量设置为
    true
    ,因此永远不会到达
    ev.preventDefault()
    语句,表单将提交


请发布您的完整代码,以便我们做出正确的评估。我如何才能做到这一点?我尝试了
$('form')。submit()在error函数中,什么也没有发生。
$(“#myform”).submit()将再次调用他的提交函数。我想你是指
$('#myform')[0].submit()
或类似的东西来调用表单上的submit,而不是
jquery
submit函数。好的,我尝试了
$('form')。解除绑定('submit')。submit()有效:D tx all此方法不可靠,因为当通过
[Enter]
(在输入字段)提交表单时,它从不阻止提交。我想她足够聪明来处理这部分。
var ajax_request_made = false,
    fail_status = false;
$('form').submit(function(ev){
  var the_form = this;
  if(fail_status){
      fail_status = false;
      return; //No prevent default, so the form is submitted.
  }

  ev.preventDefault(); // Cancel form submission
  if(ajax_request_made) { //Only allow one AJAX call at the form at a time
      return;       //Don't run the function when the request hasn't finished yet
  }

  ajax_request_made = true;
  $.ajax( ...
   complete: function(){
      ajax_request_made = false;  //Se
   },
   error: function(){
      ajax_request_made = false;
      fail_status = true;         // Set flag so that the form submits (see top)
      the_form.submit();          // Request form submission.
   } ...
  );
});