2011-03-06 11 views
14

Ho bisogno di creare un modulo con pochi input quando si verifica un evento. Il mio codice è sottoFirefox non invierà un modulo creato da JavaScript

Chrome inoltrato correttamente: viene visualizzata la finestra di avviso e la pagina cambia.

Firefox non funziona: la finestra di avviso mostra ma la pagina rimane la stessa. Come posso ottenere che Firefox invii il modulo?

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

Spara al buio: imposta il modulo su 'display: none' e aggiungilo a un elemento esistente in DOM e quindi inviarlo. Immagino che FF richieda che sia già nel DOM. – BalusC

+0

@Balus: o ancora meglio, cancellarlo dopo l'invio? – JCOC611

+0

@ JCOC: questo non è un problema per questo specifico problema :) La pagina verrà aggiornata comunque poiché OP non usa roba jaxical. – BalusC

risposta

23

FF richiede di essere nel DOM già. Imposta il modulo su display:none e aggiungilo a un elemento esistente in DOM e quindi inviarlo.

+0

Non funzionerebbe anche questo? 'document.body.appendChild (form);' Sono onestamente non troppo chiaro su distinti tra "DOM" e "page" in questo contesto. Ha un problema simile in cui ha funzionato bene in Chrome e non è riuscito in IE e FireFox. – ficuscr

+0

'document' è il nodo radice dell'albero DOM. – BalusC

+0

Ci scusiamo per errori di battitura nell'ultimo commento. Volevo chiarire che mentre 'documento.createElement' non lo aggiunge al DOM (come supponevo), può ancora essere realizzato a livello di codice con 'appendChild'. Cioè, non richiede che il modulo sia nella marcatura HTML quando è istanziato o qualcosa del genere. – ficuscr

6

Try This ...

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;
document.body.appendChild (modulo);
form.submit();

Problemi correlati