2013-06-19 61 views
3

由於javascript(包括表單提交)是除Ajax調用之外的同步和單線程模型。是對的嗎?但是我面臨着一個關於這個問題的問題。如何使表單提交同步?

我在第1行提交表單,然後關閉彈出窗口。發生什麼事情是self.close在表單提交前被調用。 所以這裏它是以異步模式運行的。表單提交是一個異步過程嗎?如果是的,我怎樣才能使後 表單提交同步的代碼(我不想使用setTimeout和AJAX)

這裏是我的相關JSP代碼

function clickSave() 
{ 

    document.form.action="customerAction.do"; 
    document.form.submit();// line 1 
    self.close();// line 2 

} 

更新: - ?貌似我需要根據Is form submit synchronous or async?來糾正我自己的表單提交異步過程。所以,問題是,怎樣才能讓self.close同步表單提交

回答

4

如JavaScript(包括表單提交),除了Ajax調用同步和單 線程模型。是對的嗎?但我面臨着一個 問題。

那麼,JS是每個事件偵聽器異步。 Ajax允許異步模式,將結果作爲事件返回。

JS大多不是併發的:只有一個函數在執行。 Overwere,在最新版本中,有許多方法可以創建背景「併發」JS(1)

JS在單線程上運行。 (背景JS除外)

我在第1行提交表單,然後關閉彈出窗口。 發生什麼是self.close在表單提交之前被調用。

這是不可能的。

表單提交是一個異步過程嗎?

提交是異步的,也就是說JS會繼續運行並結束。

你可以測試一下這個例子(2)。

如果是的,我怎樣才能使表單提交同步後的代碼?(我 不想使用setTimeout和AJAX)

提交將刷新整個頁面,讓您的JS會結束後該窗口將從表單結果的服務器加載新頁面。你可以在這個新頁面中包含一個新的JS來「繼續」。

如果您不想重裝所有的頁面,您必須使用AJAX,在這種情況下,你有兩個選擇:

  • 異步:您可以將一個事件偵聽器來接收和使用結果。
  • 同步:您的頁面將阻塞,直到結果準備就緒。

注: (1):https://developer.mozilla.org/en-US/docs/Web/Guide/Performance/Using_web_workers?redirectlocale=en-US&redirectslug=DOM%2FUsing_web_workers

(2):

<html> 
    <body> 
     <script type="text/javascript"> 
     function click2() 
     { 
      document.getElementById('form1').submit(); 
      for(var i=0; i < 1000000000; i++); 
      window.open('http://www.stackoverflow.com'); 
     } 
     </script> 

     <button onclick="click2();"> click </button> 
     <br/><br/> 
     <form id="form1" action="http://www.duckduckgo.com" method="get"> 
      <input type="text" value="hello"/> 
     </form> 
    </body> 
</html> 
+0

我覺得我可以做的一件事創建self.close script標籤,並返回到同一頁面。它會關閉窗口,那就是我認爲的 – emilly

+0

「我在第1行提交表單,然後關閉彈出窗口,發生什麼事情是self.close在表單提交之前調用。」我的意思是說,調用不會去到服務器,因爲表單提交是異步的,甚至在調用去服務器之前執行self.close。 「所以這可能:)」 – emilly

+1

否:什麼是異步的響應,呼叫總是同步的,並將始終發送到服務器。 當然,如果服務器返回404或任何其他錯誤,您的JS將無法處理它。 –