El beforeunload
evento se activa cada vez que el usuario abandona su página por cualquier motivo.
Por ejemplo, se activará si el usuario envía un formulario, hace clic en un enlace, cierra la ventana (o pestaña) o va a una nueva página utilizando la barra de direcciones, el cuadro de búsqueda o un marcador.
Puede excluir envíos de formularios e hipervínculos (excepto de otros marcos) con el siguiente código:
var inFormOrLink;
$('a').on('click', function() { inFormOrLink = true; });
$('form').on('submit', function() { inFormOrLink = true; });
$(window).on("beforeunload", function() {
return inFormOrLink ? "Do you really want to close?" : null;
})
Para las versiones jQuery anteriores a 1.7, intente esto:
var inFormOrLink;
$('a').live('click', function() { inFormOrLink = true; });
$('form').bind('submit', function() { inFormOrLink = true; });
$(window).bind("beforeunload", function() {
return inFormOrLink ? "Do you really want to close?" : null;
})
El live
método no funciona con el submit
evento, por lo que si agrega un nuevo formulario, también deberá vincularlo con el controlador.
Tenga en cuenta que si un controlador de eventos diferente cancela el envío o la navegación, perderá el mensaje de confirmación si la ventana se cierra más tarde. Se podría arreglar eso registrando el tiempo de los submit
y click
eventos, y comprobando si la beforeunload
pasa más de un par de segundos más tarde.
Ctrl + r
,F5
,Ctrl + Shift + r
y el cambio de la dirección URL del navegador?.on()
.Tal vez solo desvincula el
beforeunload
controlador de eventos dentro del controlador de eventos del formulariosubmit
:fuente
onsubmit=...
en cada formulario. (Tengo muchas formas por página, en cierta aplicación web)Para una solución de navegador cruzado (probado en Chrome 21, IE9, FF15), considere usar el siguiente código, que es una versión ligeramente modificada del código de Slaks:
Tenga en cuenta que desde Firefox 4, el mensaje "¿Realmente desea cerrar?" no se muestra FF solo muestra un mensaje genérico. Ver nota en https://developer.mozilla.org/en-US/docs/DOM/window.onbeforeunload
fuente
live
y lasbind
declaraciones aon
, que funciona muy bien con el último nivel de jQuery. ¡Gracias!fuente
Para una solución que funcionó bien con controles de terceros como Telerik (ej .: RadComboBox) y DevExpress que usan las etiquetas Anchor por varias razones, considere usar el siguiente código, que es una versión ligeramente modificada del código de desm con un mejor selector para sí mismo etiquetas de anclaje de orientación:
fuente
Mi respuesta está dirigida a proporcionar puntos de referencia simples.
CÓMO
Ver la respuesta de @SLaks .
¿Cuánto tiempo tarda el navegador en cerrar finalmente su página?
Cada vez que un usuario cierra la página ( xbotón o CTRL+ W), el navegador ejecuta el
beforeunload
código dado , pero no indefinidamente. La única excepción es el cuadro de confirmación (return 'Do you really want to close?
) que esperará hasta la respuesta del usuario.Cromo : 2 segundos.
Firefox : ∞ (o doble clic, o forzar al cerrar)
Borde : ∞ (o doble clic)
Explorer 11 : 0 segundos.
Safari : TODO
Lo que solíamos probar esto:
Lo que hace es enviar tantas solicitudes como sea posible antes de que el navegador cierre su página (sincrónicamente).
Salida de cromo:
fuente
Utilicé la respuesta Slaks, pero eso no funcionaba como está, ya que onbeforeunload returnValue se analiza como una cadena y luego se muestra en el cuadro de confirmaciones del navegador. Entonces se mostró el valor verdadero, como "verdadero".
Solo usando return funcionó. Aqui esta mi codigo
fuente
Tal vez podría manejar OnSubmit y establecer una marca que luego verificará en su controlador OnBeforeUnload.
fuente
fuente
Desafortunadamente, si se trata de una recarga, una nueva redirección de página o un cierre del navegador, se activará el evento. Una alternativa es capturar la identificación que activa el evento y, si es un formulario, no active ninguna función y si no es la identificación del formulario, haga lo que quiera hacer cuando se cierre la página. No estoy seguro de si eso también es posible directamente y es tedioso.
Puede hacer algunas cosas pequeñas antes de que el cliente cierre la pestaña. JavaScript detecta la pestaña de cierre del navegador / cierra el navegador, pero si su lista de acciones es grande y la pestaña se cierra antes de que termine, no puede hacer nada. Puedes probarlo pero con mi experiencia no dependas de ello.
https://developer.mozilla.org/en-US/docs/Web/Reference/Events/beforeunload?redirectlocale=en-US&redirectslug=DOM/Mozilla_event_reference/beforeunload
fuente
Si su envío de formulario los lleva a otra página (como supongo que lo hace, por lo tanto, se activa
beforeunload
), podría intentar cambiar su envío de formulario a una llamada ajax. De esta manera, no abandonarán su página cuando envíen el formulario y puede usar subeforeunload
código de enlace como lo desee.fuente
Mi problema: el evento 'onbeforeunload' solo se activaría si hubiera un número impar de envíos (clics). Tenía una combinación de soluciones de subprocesos similares en SO para que mi solución funcionara. bueno mi código hablará.
fuente
A partir de jQuery 1.7, el método .live () está en desuso. Use .on () para adjuntar controladores de eventos. Los usuarios de versiones anteriores de jQuery deben usar .delegate () en lugar de .live ()
en completo o enlace
fuente
Prueba esto también
fuente
Solo verifica ...
fuente
fuente
Lo siguiente funcionó para mí;
fuente
event.clientY
es negativo si hace clic en el botón de cierre del navegador o en el botón de cierre de pestaña. Sin embargo, este valor es positivo cuando vuelve a cargar la página con métodos abreviados de teclado (F5, Ctrl-R) o cierra el navegador con métodos abreviados de teclado (por ejemplo, Alt-F4). Por lo tanto, no puede confiar en la posición del evento para diferenciar el evento de cierre del navegador del evento de recarga de página.