我的网站上有一个用户提交内容并获得结果的表单
<form accept-charset="UTF-8" action="/submit-stuff" data-remote="true" method="post">
<!-- various form fields -->
<input type="submit" value="Run Code" id="submit-button">
</form>
在将信息提交到后端之前,我尝试使用Javascript获取结果。如果我可以获得结果,请在Javascript中return false
以阻止表单提交。
$('#submit-button').click(function() {
if(canGetResults()){
//deal with submission and then
return false;
}
//the button will work as usual if canGetResults is false or there's an error
});
这很好用,但现在我想通过另一个ajax请求尝试获取结果,如果失败则只提交到我的常规后端。单击按钮后,我调用以下代码:
$.post("http://example.com/submit-stuff", json, function(data) {
//do stuff with data
});
但是,它是异步的(因此我无法从中返回结果)所以即使其他ajax尝试失败,代码也会达到return false
。 我应该如何解决这个问题,以便在ajax尝试失败时只提交给我自己的后端?
我可以将$ .post更改为$ .ajax并使其同步,但通常不建议这样做。或者,我可以在$.post
回调中提交表单,但我应该如何从那里提交整个表单?如果出现错误或http://example.com/submit-stuff不起作用,它还会提交吗?
答案 0 :(得分:3)
您的提交处理程序应始终阻止表单提交。
然后,如果Ajax代码返回OK,您应该调用表单的submit()
方法。这将绕过提交处理程序并提交表单。
注意:在DOM对象上调用submit
,而不是jQuery对象。 jQuery习惯于从包装器中触发事件处理程序。
答案 1 :(得分:1)
您可以在提交函数中绑定ajax请求,并在必要时调用.post()
事件:
$("form").submit(function(e){
e.preventDefault(); // <-prevents normal submit behaviour
//only post if your ajax request goes your way
$.ajax(url,function(data){
//argument to post or not
if(data=="success"){ postForm(); }
});
});
function postForm(){
$.post(
"/submit-stuff"
,$( "form" ).serialize()
,function(data){
//your code after the post
});
}
如果您不想为postForm创建单独的函数,那么您可以将它放在当前调用它的包装器中。