2009-08-11 97 views
5

是否可以在表單的onsubmit()中發送ajax請求?我一直在嘗試,結果很差,主要是因爲如果瀏覽器發送我的請求比發送原始表單需要更長時間,那麼一旦加載頁面的位置發生變化,我的請求就會被丟棄,所以有時候從來沒有碰到服務器。在表單提交之前發送Ajax請求

基本上,我想要做的是添加一個收集登錄事件的審計日誌收集器,我想用最少的入侵將其掛接到現有的應用程序。

+0

如果您爲AJAX請求使用特定的JavaScript框架,請告訴我,我可以給您一個更具體的答案。 – 2009-08-11 23:35:09

回答

18

這很容易實現。只需暫停表單提交,直到AJAX請求完成。

使您的表格onsubmit屬性調用AJAX函數並返回false(取消表單提交)。當你的AJAX調用完成時,以編程方式提交表單。

例如:

<form name="myform" onsubmit="javascript: startAjax(); return false;"> 
... 
<script type="text/javascript"> 
function startAjax() {} // Calls ajaxComplete() when finished 

function ajaxComplete() 
{ 
    document.myform.submit(); 
} 
</script> 
+1

如果我在發送Ajax請求後立即對Ajax請求的結果不感興趣並想要提交表單,該怎麼辦?我仍然可以使用這種方法,並在'startAjax()'函數本身中進行明確的表單提交嗎? – 2013-12-24 18:32:03

+0

不會進入循環嗎? – 2017-03-14 14:32:51

0

還有另一種方式來解決這個問題,那就是你可以在Ajax調用的同步。

例子:

xmlhttp.open("GET", imageUrlClickStream, false); 

通過這一點,我們可以確保表單提交會等到Ajax調用得到的迴應。

+0

雖然這可能有效,但這是一個非常糟糕的做法。執行同步請求會凍結頁面執行,因爲瀏覽器必須等待響應才能繼續執行任何其他JavaScript代碼。 – HoLyVieR 2012-10-01 13:51:22

0

用onclick替換onslick,對我來說很好,因爲onsubmit會進入循環。

<form name="myform" onclick="javascript: startAjax(); return false;"> 
... 
<script type="text/javascript"> 
function startAjax() {} // Calls ajaxComplete() when finished 

function ajaxComplete() 
{ 
    document.myform.submit(); 
} 
</script>