Tengo el requisito de implementar un mensaje "Cambios no guardados" en una aplicación ASP .Net. Si un usuario modifica los controles en un formulario web e intenta salir antes de guardar, debería aparecer un mensaje advirtiéndole que tiene cambios sin guardar y darle la opción de cancelar y permanecer en la página actual. El mensaje no debería aparecer si el usuario no ha tocado ninguno de los controles.
Idealmente, me gustaría implementar esto en JavaScript, pero antes de seguir el camino de implementar mi propio código, ¿existen marcos existentes o patrones de diseño recomendados para lograr esto? Idealmente, me gustaría algo que se pueda reutilizar fácilmente en varias páginas con cambios mínimos.
javascript
asp.net
prompt
tbreffni
fuente
fuente
Respuestas:
Usando jQuery:
Combine con los métodos
onunload
/onbeforeunload
según sea necesario.A partir de los comentarios, lo siguiente hace referencia a todos los campos de entrada, sin duplicar el código:
El uso se
$(":input")
refiere a todos los elementos de entrada, área de texto, selección y botón.fuente
change
para las entradas de texto se activa una vez al dejar / perder el enfoque, mientras que seinput
activa por cada pulsación de tecla. (Por lo general, lo uso juntochange
con JQueryone()
, para evitar múltiples eventos).Una pieza del rompecabezas:
Y otro :
Envuélvelo todo y ¿qué obtienes?
Probablemente también desee cambiar el registro del
beforeunload
controlador de eventos para usarLIBRARY_OF_CHOICE
el registro de eventos.fuente
onclick="window.onbeforeunload=null"
)En la página .aspx, necesita una función de Javascript para saber si la información del formulario está "sucia" o no
y en el código subyacente, agregue los desencadenadores a los campos de entrada y restablezca los botones de envío / cancelación ...
fuente
Lo siguiente utiliza la función onbeforeunload del navegador y jquery para capturar cualquier evento onchange. TI también busca cualquier botón de envío o reinicio para reiniciar el indicador que indica que se han producido cambios.
fuente
Gracias por las respuestas a todos. Terminé implementando una solución usando JQuery y el complemento Protect-Data . Esto me permite aplicar automáticamente la supervisión a todos los controles de una página.
Sin embargo, hay algunas advertencias, especialmente cuando se trata de una aplicación ASP .Net:
Cuando un usuario elige la opción cancelar, la función doPostBack arrojará un error de JavaScript. Tuve que poner manualmente un try-catch alrededor de la llamada .submit dentro de doPostBack para suprimirlo.
En algunas páginas, un usuario puede realizar una acción que realiza una devolución de datos en la misma página, pero no es un guardado. Esto da como resultado el restablecimiento de la lógica de JavaScript, por lo que cree que nada ha cambiado después de la devolución cuando algo puede haber cambiado. Tuve que implementar un cuadro de texto oculto que se vuelve a publicar con la página y se usa para contener un valor booleano simple que indica si los datos están sucios. Esto persiste en las devoluciones de datos.
Es posible que desee que algunas devoluciones de datos en la página no activen el cuadro de diálogo, como un botón Guardar. En este caso, puede usar JQuery para agregar una función OnClick que establece window.onbeforeunload en nulo.
Con suerte, esto es útil para cualquier otra persona que tenga que implementar algo similar.
fuente
Solución general que admite varios formularios en una página determinada ( solo copie y pegue en su proyecto )
Nota: Esta solución se combina con las soluciones de otros para crear una solución integrada general.
caracteristicas:
fuente
_isDirty
variable descrita por Aaron Powell. No vi la necesidad de agregar y eliminar clases del HTML en lugar de variables en el javascript.La siguiente solución funciona para prototipos (probada en FF, IE 6 y Safari). Utiliza un observador de formulario genérico (que dispara formulario: cambiado cuando se ha modificado cualquier campo del formulario), que también puede usar para otras cosas.
fuente
Aquí hay una solución javascript / jquery que es simple. Tiene en cuenta las "deshacer" por parte del usuario, está encapsulado dentro de una función para facilitar la aplicación y no falla en el envío. Simplemente llame a la función y pase el ID de su formulario.
Esta función serializa el formulario una vez cuando se carga la página y nuevamente antes de que el usuario abandone la página. Si los dos estados del formulario son diferentes, se muestra el mensaje.
Pruébelo: http://jsfiddle.net/skibulk/Ydt7Y/
fuente
Recientemente contribuí a un complemento jQuery de código abierto llamado dirtyForms .
El complemento está diseñado para funcionar con HTML agregado dinámicamente, admite múltiples formularios, puede admitir prácticamente cualquier marco de diálogo, recurre al navegador antes de descargar el cuadro de diálogo, tiene un marco auxiliar conectable para admitir la obtención del estado sucio de editores personalizados (se incluye un complemento tinyMCE) , funciona dentro de iFrames, y el estado sucio se puede configurar o restablecer a voluntad.
https://github.com/snikch/jquery.dirtyforms
fuente
Detectar cambios de formulario con jQuery es muy simple:
fuente
Amplié la sugerencia de Slace anterior, para incluir la mayoría de los elementos editables y también excluir ciertos elementos (con un estilo CSS llamado "srSearch" aquí) para que no provoquen que se establezca la bandera sucia.
fuente
window.onbeforeunload = unloadPage;
fuente
Esto es exactamente lo que el complemento Fleegix.js
fleegix.form.diff
(http://js.fleegix.org/plugins/form/diff ) fue creado para. Serialice el estado inicial del formulario en carga usandofleegix.form.toObject
(http://js.fleegix.org/ref#fleegix.form.toObject ) y guárdelo en una variable, luego compárelo con el estado actual usandofleegix.form.diff
on unload. Muy fácil.fuente
Un método , usar matrices para contener las variables para que se pueda rastrear los cambios.
Este es un método muy simple para detectar cambios , pero el resto no es tan elegante.
Otro método que es bastante simple y pequeño, de Farfetched Blog :
fuente
En IE document.ready no funcionará correctamente, actualizará los valores de entrada.
por lo que debemos vincular el evento de carga dentro de la función document.ready que también se encargará del navegador IE.
A continuación se muestra el código que debe poner dentro de la función document.ready.
fuente