2011-03-06 15 views
14

Necesito crear un formulario con algunas entradas cuando ocurre un evento. Mi código está abajo.Firefox no enviará un formulario creado por JavaScript

Chrome presenta una respuesta correcta: se muestra el cuadro de alerta y la página cambia.

Firefox no funciona: el cuadro de alerta muestra pero la página sigue siendo la misma. ¿Cómo puedo hacer que Firefox envíe el formulario?

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

Disparar en la oscuridad: configure el formulario para 'mostrar: ninguno' y agréguelo a un elemento existente en DOM y luego preséntelo. Me imagino que FF requiere que ya esté en DOM. – BalusC

+0

@Balus: o mejor aún, ¿eliminarlo después de enviar? – JCOC611

+0

@JCOC: eso no es una preocupación para este problema específico :) La página se actualizará de todos modos ya que OP no usa material ajaxical. – BalusC

Respuesta

23

FF requiere que esté en el DOM ya. Establezca el formulario en display:none y agréguelo a un elemento existente en DOM y luego envíelo.

+0

¿No funcionaría esto también? 'document.body.appendChild (form);' Honestamente, no estoy muy claro sobre la diferencia entre "DOM" y "page" en este contexto. Tiene un problema similar donde funcionó bien en Chrome y falló en IE y Firefox. – ficuscr

+0

'document' es el nodo raíz del árbol DOM. – BalusC

+0

Perdona por errores tipográficos en el último comentario. Quería dejar en claro que, mientras 'documento.createElement' no lo agrega al DOM (como lo había supuesto) todavía se puede lograr mediante programación con 'appendChild'. Es decir, no requiere que la forma esté en el marcado HTML cuando se crea una instancia o algo por el estilo. – ficuscr

6

intenta esto ...

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 (form);
form.submit();

Cuestiones relacionadas