que estaba buscando una mejor solución a esto. Lo que queremos es simplemente excluir uno o más factores desencadenantes de la creación de nuestro "¿Estás seguro?" caja de diálogo. Por lo tanto, no deberíamos crear más y más soluciones para más y más efectos secundarios. ¿Qué ocurre si el formulario se envía sin un evento click
del botón Enviar? ¿Qué pasa si nuestro manejador de clics elimina el estado isDirty
pero luego el formulario enviado se bloquea después? Claro que podemos cambiar el comportamiento de nuestros disparadores, pero el lugar correcto sería la lógica que maneja el diálogo. Vincular al evento submit
del formulario en lugar de vincular al evento click
del botón Enviar es una ventaja de las respuestas en este hilo por encima de otras que vi antes, pero este mensaje de mi humilde opinión simplemente soluciona el problema.
Después de buscar en el evento objeto del evento onbeforeunload
encontré la propiedad .target.activeElement
, que contiene el elemento, que desencadenó el evento originalmente. Entonces, yay, es el botón o enlace o lo que sea que hayamos hecho clic (o nada en absoluto, si el navegador se ha navegado). Nuestro "¿Estás seguro?" la lógica de diálogo y luego se reduce a los dos componentes siguientes:
isDirty
El manejo de la forma: "¿Está seguro"
$('form.pleaseSave').on('change', function() {
$(this).addClass('isDirty');
});
El la lógica de diálogo:
$(window).on('beforeunload', function(event) {
// if form is dirty and trigger doesn't have a ignorePleaseSave class
if ($('form.pleaseSave').hasClass('isDirty')
&& !$(event.target.activeElement).hasClass('ignorePleaseSave')) {
return "Are you sure?"
}
// special hint: returning nothing doesn't summon a dialog box
});
Es simplemente como eso. No se necesitan soluciones. Simplemente dé los disparadores (enviar y otros botones de acción) una clase ignorePleaseSave
y la forma en que queremos que el diálogo se aplique a una clase pleaseSave
. Todas las otras razones para descargar la página luego convoca nuestro "¿Estás seguro?" diálogo.
P.S. Estoy usando jQuery aquí, pero creo que la propiedad .target.activeElement
también está disponible en JavaScript.
Acepté esto sobre @ Derek porque ya tenía código de envío personalizado y necesitaba verificar los dos valores por separado. – mtmurdock