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