Tengo un sitio web antiguo con JQuery 1.7 que funciona correctamente hasta hace dos días. De repente, algunos de mis botones ya no funcionan y, después de hacer clic en ellos, aparece esta advertencia en la consola:
Envío de formulario cancelado porque el formulario no está conectado
El código detrás del clic es algo como esto:
this.handleExcelExporter = function(href, cols) {
var form = $('<form method="post"><input type="submit" /><input type="hidden" name="layout" /></form>').attr('action', href);
$('input[name="layout"]', form).val(JSON.stringify(cols));
$('input[type="submit"]', form).click();
}
Parece que Chrome 56 ya no es compatible con este tipo de código. ¿No es así? En caso afirmativo, mi pregunta es:
- ¿Por qué sucedió esto de repente? Sin ninguna advertencia de desaprobación?
- ¿Cuál es la solución para este código?
- ¿Hay alguna manera de obligar a Chrome (u otros navegadores) a funcionar como antes sin cambiar ningún código?
PD : tampoco funciona en la última versión de Firefox (sin ningún mensaje). ¡Tampoco funciona en IE 11.0 y Edge! (ambos sin ningún mensaje)
javascript
jquery
google-chrome
jquery-1.7
Mahmoud Moravej
fuente
fuente
.submit()
controlador jQuery (además del.click()
método indicado anteriormente).Respuestas:
Respuesta rápida: agregue el formulario al cuerpo.
document.body.appendChild(form);
O, si está utilizando jQuery como se indica arriba:
$(document.body).append(form);
Detalles: de acuerdo con los estándares HTML, si el formulario no está asociado con el contexto de navegación (documento), se cancelará el envío del formulario.
HTML SPEC ver 4.10.21.3.2
En Chrome 56, se aplicó esta especificación.
Dif. De código de Chrome ver @@ -347,9 +347,16 @@
PD sobre tu pregunta # 1. En mi opinión, a diferencia de ajax, el envío de formularios provoca el movimiento instantáneo de la página.
Por lo tanto, mostrar "mensaje de advertencia obsoleto" es casi imposible.
También creo que es inaceptable que este cambio serio no esté incluido en la lista de cambios de características. Funciones de Chrome 56: www.chromestatus.com/features#milestone%3D56
fuente
$(document.body).append(form);
form[0]
, produciría un error "Error al ejecutar 'appendChild' en 'Nodo': el parámetro 1 no es del tipo 'Nodo'". en cromo. Por lo tanto, simplemente cambie adocument.body.appendChild(form[0])
.$(document.body).append(form);
. De nada, agregue su solución a la respuesta aceptada editándola o preguntándole a @ KyungHun Jeon si quiere adoptar su solución en lugar de la suya.document.body.appendChild(form[0])
(un poco más rápido) O$(document.body).append(form)
.si ve este error en React JS cuando intenta enviar el formulario presionando enter, asegúrese de que todos los botones del formulario que no envían el formulario tengan un
type="button"
.Si solo tiene uno
button
contype="submit"
presionar Enter, enviará el formulario como se esperaba.Referencias :
https://dzello.com/blog/2017/02/19/demystifying-enter-key-submission-for-react-forms/ https://github.com/facebook/react/issues/2093
fuente
<form>
todavía tiene que renderizarse en el DOM después de hacer clic. es decir, esto fallará `{this.state.submitting? <div> El formulario se está enviando </div>: <form onSubmit = {() => this.setState ({submitting: true}) ...> <button ...> </form>} `Entonces, cuando el se envía el formulario,state.submitting
se configura y aparece el mensaje "enviando ..." en lugar del formulario, entonces se produce este error. Mover la etiqueta del formulario fuera del condicional garantiza que siempre esté allí cuando sea necesario.form
elemento a adiv
. Creo que si solo cambia el contenido del elemento enform
lugar de reemplazarlo, funcionará como se espera.agregue el tipo de atributo = "botón" al botón de quién hace clic para ver el error, funcionó para mí.
fuente
Debe asegurarse de que el formulario esté en el documento. Puede agregar el formulario al cuerpo.
fuente
alternativamente incluir event.preventDefault (); en su handleSubmit (evento) {
ver https://facebook.github.io/react/docs/forms.html
fuente
àntd
formularios. Esto ayudóVeo que está utilizando jQuery para la inicialización del formulario.
Cuando intento la respuesta de @ KyungHun Jeon, no funciona para mí que use jQuery también.
Entonces, intenté agregar el formulario al cuerpo usando la forma jQuery:
¡Y funcionó!
fuente
Una cosa a tener en cuenta si ve esto en React, es que
<form>
aún debe mostrarse en el DOM mientras se envía. es decir, esto fallaráEntonces, cuando se envía el formulario,
state.submitting
se configura y mensaje "enviando ..." en lugar del formulario, entonces se produce este error.Mover la etiqueta del formulario fuera del condicional garantizaba que siempre estuviera allí cuando fuera necesario, es decir
fuente
Enfrenté el mismo problema en una de nuestras implementaciones.
estábamos usando jquery.forms.js. que es un complemento de formularios y está disponible aquí. http://malsup.com/jquery/form/
utilizamos la misma respuesta proporcionada anteriormente y pegamos
y funcionó. Gracias.
fuente
Dependiendo de la respuesta de KyungHun Jeon, pero appendChild espera un nodo dom, así que agregue un índice al objeto jquery para devolver el nodo:
document.body.appendChild(form[0])
fuente
document.body.appendChild(form[0])
?Agregar para la posteridad ya que esto no está relacionado con Chrome, pero este fue el primer hilo que apareció en Google al buscar este error de envío del formulario.
En nuestro caso, adjuntamos una función para reemplazar el div html actual con una animación de "carga" al enviarlo, ya que ocurrió antes de que se enviara el formulario, ya no había ningún formulario o datos para enviar.
Un error muy obvio en retrospectiva, pero en caso de que alguien termine aquí, podría ahorrarle algo de tiempo en el futuro.
fuente
He recibido este error en react.js. Si tiene un botón en el formulario que desea que actúe como un botón y no envíe el formulario, debe asignarle type = "button". De lo contrario, intenta enviar el formulario. Creo que Vaskort respondió esto con documentación que puede consultar.
fuente
Form submission canceled because the form is not connected
cada vez que presioné el botón "Cancelar" de mi formulario. Después de agregartype="button"
a mi botón "Cancelar", ya no recibo la advertencia. ¡Gracias!Pude deshacerme del mensaje al agregar el atributo type = "button" al elemento button en vue.
fuente
También puede resolverlo, aplicando un solo parche en jquery-xxxjs simplemente agregue después de "try {rp;} catch (m) {}" línea 1833 este código:
if (r instanceof HTMLFormElement &&! r.parentNode) { r.style.display = "none"; document.body.append (r); r [p] (); }
Esto valida cuando un formulario no es parte del cuerpo y lo agrega.
fuente
Noté que recibía este error, porque mi código HTML no tenía
<body>
etiqueta.Sin un
<body>
, cuando ladocument.body.appendChild(form);
declaración no tenía un objeto de cuerpo para agregar.fuente
Vi este mensaje usando angular, así que simplemente eliminé method = "post" y action = "", y la advertencia desapareció.
fuente