2011-11-21 31 views
0

我想要一个submit()处理程序附加到一个窗体来运行一个ajax请求,当它返回时,表单正常提交自己。这可能吗? $('#myForm')。submit()将递归地调用相同的函数。jquery调用自定义表单提交,然后正常

我宁愿不将事件处理程序附加到提交按钮的单击上,因为并非所有用户都使用鼠标提交表单。很多人和我一样,只是使用返回键。

回答

5

试试这个。在下面的代码中,我将绑定Ajax成功处理程序中的表单提交事件处理程序,然后提交表单。

$('form').bind('submit', function(){ 

    //Do ajax call here 
    $.ajax({ 
     url: "url", 
     success: function(){ 
      //On success do what you want to do 
      //and then ubind the submit event handler and submit the form 

      $('form').unbind('submit').submit(); 
     } 
    }); 

    //Prevent default form submit 
    return false; 

}); 
+0

解除绑定!咄!谢谢,我会尝试,但我已经知道它会起作用。 :) – UncleCheese

+0

@UncleCheese - 如果它对你有帮助,你能把这个标记为答案吗? – ShankarSangoli

1

这应该为你工作:

$('form').submit(function(e) { 
    e.preventDefault(); 
    var that = this; 
    $.post('url', function() { 
     that.submit(); 
    }); 
}); 

e.preventDefault()停止默认的形式提交。然后你可以在dom元素上调用.submit()来执行一个未被jQuery处理程序捕获的提交。

+0

有趣。我会试试这个。我很难看到为什么that.submit()不会触及preventDefault()调用? – UncleCheese

0

你可以有一个变量来标记是否收到了ajax响应。 这可能比解除“提交”事件处理程序稍微优雅一些​​,但这是另一个想法。

var ajaxResponse = false; 

$('form').submit(function() { 
    var form = $(this); 
    if(ajaxResponse == false){ 
     $.post('url', function() { 
      ajaxResponse = true; 
      // Do something 
      form.submit(); 
     }); 
     return false; 
    }else{ 
     return true; 
    } 
});