2009-08-27 141 views
1

我有幾種形式(用戶可以動態添加新表單)在一個頁面中,它們都被提交給相同的struts2操作。我需要在用戶點擊保存按鈕時提交所有這些表單。

事情在FF中進展順利。但在IE和Google chrome中,只有最後一個表單被提交。在IE和谷歌瀏覽器中多表單提交

任何幫助表示讚賞。謝謝。

每個窗體的元素是相同的,一個窗體構成一個對象。每個表單的數據將被添加到一個域對象中,然後該對象將被保存到數據庫中。

JavaScript函數來處理保存操作:

<script type="text/javascript" > 
    function submit() { 
     var formCnt = document.getElementById('formCnt').value; 
     for(var i = 1; i <= formCnt; i++) { 
      var formName = 'form' + i; 
      document.forms[formName].submit(); 
     } 
    } 
</script> 
... 
<input type="hidden" id="formCnt" name="formCnt" value="5" /> 

<form action="add.htm" name="form1" id="form1" method="post" enctype="multipart/form-data" /> 
    <input type="text" name="item.price" id="item.price" value="" /> 
    ... 
</form> 

<form action="add.htm" name="form2" id="form2" method="post" enctype="multipart/form-data" /> 
    <input type="text" name="item.price" id="item.price" value="" /> 
    ... 
</form> 

    ... 

<form action="add.htm" name="form5" id="form5" method="post" enctype="multipart/form-data" /> 
    <input type="text" name="item.price" id="item.price" value="" /> 
    ... 
</form> 

    ... 
+0

通過「它在FF工作」我想你的意思是數據保存到數據庫?你沒有同時從同一個struts動作中收到所有形式的所有內容,對嗎? – deceze 2009-08-27 05:52:22

+0

只有一個名爲AddAction的struts動作,頁面上的表單全部提交給AddAction。所以我不能在jsp頁面中使用不同的字段名稱,就像你在上面的html src中看到的那樣。我正在考慮使用XHR嘗試異步提交。希望這會起作用。感謝您的詳細解答。 – user163970 2009-08-27 08:26:33

+0

您無法控制服務器端腳本?順便說一下,投票和接受按鈕是表示感謝的首選方式。 :o) – deceze 2009-08-27 12:49:34

回答

0

您應該只能夠在同一時間提交一個表單。提交按鈕必須位於<form>標籤內,並且只應提交提交按鈕所在的表單。那隱藏的input標籤應該在表單標籤裏面以及BTW。

即使通過JS執行,submit()也會向服務器發起一個新的POST請求。你一次只能提出一個請求,這就是爲什麼只有最後一個出現。我不知道爲什麼它會在FF中工作。

如果您無論如何都需要立即提交所有內容,爲何要將它分解開始?如果您需要表單中的「小節」,則可以使用<fieldset>標籤。

編輯

當你運行你的腳本是一樣的,如果你所有的形式有一個提交按鈕,然後單擊所有在提交訂單的快速按鈕,會發生什麼。單擊一個提交按鈕將該表單的數據發送到POST請求中的服務器,並刷新該頁面。如果您在頁面刷新前快速點擊另一個按鈕,則可以提交另一個表單,舊請求將被取消。

我可以想象的唯一途徑就是如果在觸發下一個submit()之前請求恰好發送,所有形式的數據可能如何以服務器的方式到達服務器。從本質上講,您依賴於瀏覽器速度很慢,或者至少在繼續執行腳本之前處理請求。顯然,這在FF中起作用,但在其他瀏覽器中失敗。正如它應該。

編輯2

如果您需要提交多個字段具有相同的名稱,使用一種形式,給你的領域唯一的名稱。最好的命名方案取決於你的後端如何處理表單提交。

  • item0item1
  • item.0item.1
  • Model.0.itemModel.1.item
0

我相信你只能在一個時間只有一個提交 - 這可能是一個不好的做法,但如何關於基本上覆制每個表單代碼並將其複製到iframe中,在那裏提交表單,或者依靠XHR($ .post)來模擬表單將執行的操作。

0

嘗試使用document.getElementById(formId).submit();代替。 document.form.x,document.forms [int],document.forms [id]和document.x訪問表單的方法不是跨瀏覽器兼容的引用表單的方法。

另外 - 我相信我曾經有一個問題,當我在我的表單上有一個名稱和一個ID。最好的做法是使用我相信的ID。

+0

嘗試getElementById,仍然無法正常工作。我正在尋找Ajax解決方案,謝謝。 – user163970 2009-08-27 08:27:57