我有一个挂在$('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...
});
答案 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_request_made = false
,以启用新表单提交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.
} ...
);
});