Tengo algunas páginas con formularios en mi solicitud.
¿Cómo puedo asegurar el formulario de tal manera que si alguien se aleja o cierra la pestaña del navegador, se les debe solicitar que confirmen que realmente quieren dejar el formulario con datos no guardados?
javascript
forms
Kan
fuente
fuente
Respuestas:
Respuesta corta e incorrecta:
Puede hacer esto manejando el
beforeunload
evento y devolviendo una cadena no nula :El problema con este enfoque es que enviar un formulario también está activando el evento de descarga . Esto se soluciona fácilmente agregando una marca que está enviando un formulario:
Luego llamando al setter al enviar:
Pero sigue leyendo ...
Respuesta larga y correcta:
Tampoco desea mostrar este mensaje cuando el usuario no ha cambiado nada en sus formularios . Una solución es usar el
beforeunload
evento en combinación con una bandera "sucia", que solo activa el aviso si es realmente relevante.Ahora para implementar el
isDirty
método, hay varios enfoques.Puede usar jQuery y la serialización de formularios , pero este enfoque tiene algunos defectos. Primero, tiene que modificar el código para que funcione en cualquier forma (
$("form").each()
lo hará), pero el mayor problema es que jQueryserialize()
solo funcionará en elementos con nombre y sin discapacidad, por lo que cambiar cualquier elemento con o sin nombre no activará el indicador sucio. Hay soluciones alternativas para eso , como hacer que los controles sean de solo lectura en lugar de habilitar, serializar y luego deshabilitar los controles nuevamente.Entonces los eventos parecen el camino a seguir. Puedes intentar escuchar las pulsaciones de teclas . Este evento tiene algunos problemas:
El
change
evento también no se activa en los valores establecidos de código JavaScript , por lo que también no funcionará para entradas virtuales.Vincular el
input
evento a todos losinput
s (ytextarea
s yselect
s) en su página no funcionará en navegadores antiguos y, como todas las soluciones de manejo de eventos mencionadas anteriormente, no admite deshacer. Cuando un usuario cambia un cuadro de texto y luego lo deshace, o marca y desmarca una casilla de verificación, el formulario aún se considera sucio.Y cuando desee implementar más comportamiento, como ignorar ciertos elementos, tendrá aún más trabajo por hacer.
No reinventes la rueda:
Entonces, antes de pensar en implementar esas soluciones y todas las soluciones alternativas necesarias, tenga en cuenta que está reinventando la rueda y que es probable que tenga problemas que otros ya han resuelto para usted.
Si su aplicación ya usa jQuery, también puede usar código probado y mantenido en lugar de crear el suyo propio, y usar una biblioteca de terceros para todo esto. jQuery's ¿Estás seguro? El complemento funciona muy bien, vea su página de demostración . Es tan simple como esto:
Mensajes personalizados no admitidos en todas partes
Tenga en cuenta que Firefox 4 no admite mensajes personalizados en este cuadro de diálogo. A partir de abril de 2016, Chrome 51 se está implementando en el que también se eliminan los mensajes personalizados .
Existen otras alternativas en otras partes de este sitio, pero creo que un diálogo como este es lo suficientemente claro:
fuente
Consulte el evento JavaScript onbeforeunload . Es un JavaScript no estándar introducido por Microsoft, sin embargo, funciona en la mayoría de los navegadores y su documentación onbeforeunload tiene más información y ejemplos.
fuente
vía jquery
Puede Google JQuery Form Serialize, esto recopilará todas las entradas de formulario y lo guardará en una matriz. Supongo que esta explicación es suficiente :)
fuente
Solución universal que no requiere configuración que detecte automáticamente todas las modificaciones de entrada, incluidos los elementos contentables:
fuente
Construido sobre la excelente idea de Wasim A. de utilizar la serialización. El problema era que la advertencia también se mostraba cuando se enviaba el formulario. Esto se ha solucionado aquí.
Ha sido probado en Chrome e IE 11.
fuente
Basado en las respuestas anteriores, y unidas desde varios lugares en el desbordamiento de la pila, esta es la solución que se me ocurrió que maneja el caso cuando realmente desea enviar sus cambios:
Vale la pena señalar que IE11 parece requerir que la
closeEditorWarning
función regreseundefined
para que no muestre una alerta.fuente
QC.thisPage.isDirty = false;
serwindow.thisPage.isDirty = false;
? De esa manera, verificará si está enviando el formulario y no mostrará una advertencia. Parecía trabajar para mis pruebas. Además, la mayoría de las formas tienen una eninput
lugar de unatextarea
. Usé lo siguiente, que funciona bastante bien:$("form").on('keyup', 'textarea,input,select', function () {
La siguiente frase ha funcionado para mí.
Simplemente configúrelo
modified
como verdadero o falso según el estado de su aplicación.fuente
undefined
lugar denull
como IE imprimirá 'nulo' simodified
es falso.El siguiente código funciona muy bien. Debe alcanzar los cambios de entrada de los elementos de su formulario a través del atributo id:
fuente
fuente
Puede usar serialize () para crear una cadena de texto codificada en URL serializando los valores del formulario y verificar si el formulario ha cambiado antes de la descarga
Consulte este enlace https://coderwall.com/p/gny70a/alert-when-leaving-page-with-unsaved-form Escrito por Vladimir Sidorenko
fuente
serialize()
, y de hecho, tiene sus inconvenientes.Agregando a la idea de @codecaster, podría agregar esto a cada página con un formulario (en mi caso, lo uso de manera global para que solo en los formularios tenga esta advertencia) cambie su función a
Además, envíe los formularios, incluidos los enlaces de inicio de sesión y de botones de cancelación, de modo que cuando la persona presione cancelar o enviar el formulario no se active la advertencia también en cada página con un formulario ...
fuente
Puede consultar una explicación detallada aquí: http://techinvestigations.redexp.in/comparison-of-form-values-on-load-and-before-close/ compare-of-form-values-on-load-and antes de cerrar
El código principal:
fuente
Respuesta corta:
fuente
La solución de Eerik Sven Puudist ...
... espontáneamente hizo el trabajo por mí en un entorno complejo orientado a objetos sin ningún cambio necesario.
El único cambio que apliqué fue referirme al formulario concreto (solo un formulario por archivo) llamado "formForm" ('form' -> '#formForm'):
Especialmente bien hecho es el hecho de que el botón de enviar se está "dejando solo".
Además, funciona para mí también con la última versión de Firefox (a partir del 7 de febrero de 2019).
fuente
Probé la solución universal de Eli Grey, solo funcionó después de que simplifiqué el código para
Las modificaciones a su se eliminan el uso
target[defaultValue]
y solo se utilizantarget.dataset[defaultValue]
para almacenar el valor predeterminado real.Y agregué un detector de eventos 'guardado' donde el evento 'guardado' lo activará usted mismo cuando su acción de guardado haya tenido éxito.
Pero esta solución 'universal' solo funciona en los navegadores, no funciona en la vista web de la aplicación, por ejemplo, los navegadores WeChat.
Para que funcione en los navegadores WeChat (parcialmente) también, otra mejora nuevamente:
fuente
Lo hice de manera diferente, compartiendo aquí para que alguien pueda obtener ayuda, probada solo con Chrome.
Quería advertir al usuario antes de cerrar la pestaña solo si hay algunos cambios.
Funciona bien, pero tengo otro problema, cuando envío el formulario recibo la advertencia no deseada, vi mucha solución, esto se debe a que antes de la descarga se dispara antes del envío, por eso no podemos manejarlo en un evento de envío
onbeforeunload = null
, pero El evento onclick de los botones de envío se activa antes de estos dos eventos, así que actualicé el códigofuente
En primer lugar, la mayoría de los navegadores tienen esta función por defecto. ¿Y por qué necesitas esto? ¿Por qué no mantener la forma sincronizada? Quiero decir, guárdelo en cualquier cambio sin esperar ningún envío del usuario. Al igual que los contactos de Google. Por supuesto, si solo todos los campos del formulario son obligatorios. A los usuarios no les gusta cuando les obligan a llenar algo sin la oportunidad de irse a pensar si lo necesitan. :)
fuente
save it on any change without waiting any submitting from user
No siempre quieres hacer esto. A veces, el usuario quiere hacer muchos cambios y luego revisar y confirmar que quiere guardarlo.