jQuery提交事件函数返回值

时间:2011-10-28 17:11:47

标签: ajax forms jquery

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

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

我想这样做,如果发生ajax错误,表单继续正常提交。这可能吗?

我在函数的末尾尝试return fail_status;(fail_status是一个布尔变量,在ajax“error”函数中更新为“true”),但它似乎不起作用...... < / p>

代码看起来像这样:

$('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...
});

4 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

您可以分开事件:

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

});
只要服务器有 a 响应,

complete就不会成功或失败的ajax响应。如果您想要在ajax错误上提交表单,那么您可以将提交事件放在error方法中。

答案 2 :(得分:1)

问题是JQuery默认为Asynchronous。这意味着它在获得服务器响应之前返回“fail_status”。

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

error: function(){$('#myform').submit();}

编辑:尝试重写您的功能:

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

答案 3 :(得分:1)

您必须使用同步AJAX请求(不推荐!),或使用以下代码。

背后的概念:

  • 如果fail_status == false,请继续使用该功能(默认)
  • 使用ev.preventDefault()取消表单提交。设置ajax_request_made = true
  • 发起AJAX通话
    1. 成功时:设置ajax_request_made = false,以启用新表单提交
    2. 失败时:设置ajax_request_made = false,启用新表单提交,然后设置fail_status = true。再次调用提交功能。由于此变量设置为true,因此永远不会达到ev.preventDefault()语句,并且表单会提交。

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.
   } ...
  );
});