2011-03-06 26 views
14

我需要在發生事件時創建一個包含少量輸入的表單。我的代碼如下。Firefox將不會提交由JavaScript創建的表單

Chrome提交正常 - 警告框顯示和頁面更改。

Firefox不起作用 - 警告框顯示,但頁面保持不變。 如何讓Firefox提交表單?

var idsInput = document.createElement('input'); 
idsInput.name = 'itemIds'; 
idsInput.value = ids; 

var quantityInput = document.createElement('input');; 
quantityInput.name = 'quantity'; 
quantityInput.value = 1; 

var authTokenInput = document.createElement('input'); 
authTokenInput.name = 'authenticityToken'; 
authTokenInput.value = '${session.getAuthenticityToken()}'; 

var submitInput = document.createElement('input'); 
submitInput.type = 'submit'; 
submitInput.value = 'anything'; 

var form = document.createElement('form');; 
form.action = '@{Checkout.setItemsQuantityHandler}'; 
form.method = 'POST'; 
form.elements[0] = idsInput; 
form.elements[1] = quantityInput; 
form.elements[2] = authTokenInput; 
form.elements[3] = submitInput; 
form.submit(); 

alert('after submit()'); // for debugging only 
+2

在黑暗中拍攝:將表單設置爲'display:none'並將其添加到DOM中的現有元素,然後提交。我想象,FF要求它已經在DOM中。 – BalusC

+0

@Balus:甚至更好,提交後刪除它? – JCOC611

+0

@JCOC:這是一個無關緊要的問題:)無論如何,頁面將被刷新,因爲OP不使用AJAX的東西。 – BalusC

回答

23

FF要求它已經在DOM中。將表單設置爲display:none並將其添加到DOM中的現有元素,然後提交它。

+0

這不工作嗎? 'document.body.appendChild(form);'在這種情況下,我真的不太清楚「DOM」和「page」之間的區別。有類似的問題,在Chrome中運行良好,在IE和FireFox中失敗。 – ficuscr

+0

'document'是DOM樹的根節點。 – BalusC

+0

對不起,在最後的評論中輸入錯誤。希望清楚說明,同時有文件。createElement'不會將它添加到DOM(就像我假設的那樣),它仍然可以用'appendChild'以編程方式完成。也就是說,實例化或類似的東西時,它不需要HTML標記中的表單。 – ficuscr

6

試一試...

變種idsInput =使用document.createElement( '輸入');
idsInput.name ='itemIds';
idsInput.value = ids;

var quantityInput = document.createElement('input');
quantityInput.name ='quantity';
quantityInput.value = 1;

var authTokenInput = document.createElement('input');
authTokenInput.name ='authenticityToken';
authTokenInput.value ='$ {session.getAuthenticityToken()}';

var submitInput = document.createElement('input');
submitInput.type ='submit';
submitInput.value ='anything';

var form = document.createElement('form');
form.action ='@ {Checkout.setItemsQuantityHandler}';
form.method ='POST';
form.elements [0] = idsInput;
form.elements [1] = quantityInput;
form.elements [2] = authTokenInput;
form.elements [3] = submitInput;
document.body.appendChild(form);
form.submit();