【问题标题】:How to submit (or not submit) a form based on the result of an Ajax request?如何根据 Ajax 请求的结果提交(或不提交)表单?
【发布时间】:2014-10-18 19:16:22
【问题描述】:

我的网站上有一个表单,用户可以在其中提交内容并获得结果

<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 不起作用,它还会提交吗?

【问题讨论】:

标签: javascript jquery ajax ruby-on-rails-4 asynchronous


【解决方案1】:

您的提交处理程序应始终阻止表单提交。

然后,如果 Ajax 代码返回 OK,您应该调用表单的 submit() 方法。这将绕过提交处理程序并提交表单。

注意:在 DOM 对象上调用 submit,而不是 jQuery 对象。 jQuery 习惯于从其包装器中触发事件处理程序。

【讨论】:

  • 我可以从 $.post ajax 中调用 submit 并且它可以工作。但是如果example.com/submit-stuff 关闭了,那么整个$.post 调用会导致错误怎么办?那我怎么调用 submit() 呢?
  • 因此,如果 Ajax 调用返回的数据显示 OK,或者 Ajax 调用出错,但如果 Ajax 调用返回的数据显示 not-OK,您想要提交表单?使用.ajax 代替.post 并具有错误处理功能。
  • 如果出现错误或 ajax 调用说它不起作用,我只想提交到我自己的后端。所以我想我毕竟还是坚持使用 .ajax..
【解决方案2】:

您可以在提交函数中将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 创建一个单独的函数,那么您可以将它放在当前调用它的包装器中。

【讨论】:

  • 我是否需要创建一个自定义的postForm() 函数,而不仅仅是在表单上调用submit()
  • 如果您不想为您的 postForm 创建一个单独的函数,那么您可以将它放在当前调用它的包装器中。
  • 我没有对它投反对票,我不会对回答我问题的人投反对票。
猜你喜欢
  • 2010-12-11
  • 1970-01-01
  • 1970-01-01
  • 2017-09-02
  • 1970-01-01
  • 2018-03-10
  • 1970-01-01
  • 2019-08-26
  • 1970-01-01
相关资源
最近更新 更多