¿Existe algún código JavaScript / jQuery entre navegadores para detectar si el navegador o una pestaña del navegador se está cerrando, pero no debido a que se haga clic en un enlace?
javascript
jquery
cometta
fuente
fuente
sessionStorage
Property, caducará una vez que se cierre el navegador. w3schools.com/jsref/prop_win_sessionstorage.aspRespuestas:
Si te entiendo correctamente, quieres saber cuándo una pestaña / ventana se cierra efectivamente. Bueno, AFAIK es la única forma
Javascript
de detectar ese tipo de cosasonunload
yonbeforeunload
eventos.Desafortunadamente (¿o afortunadamente?), Esos eventos también se activan cuando abandonas un sitio a través de un
link
botón de retroceso de tu navegador. Así que esta es la mejor respuesta que puedo dar, no creo que pueda detectar de forma nativa un puroclose
en Javascript. Corrígeme si me equivoco aquí.fuente
String
valor de retorno personalizado deonbeforeunload
. Así que ahora ya no podrás mostrar un mensaje personalizado antes de descargarlo.unload
?De la documentación de Firefox
Por alguna razón, los navegadores basados en Webkit no siguen las especificaciones del cuadro de diálogo. Un ejemplo de trabajo casi cruzado estaría cerca del siguiente ejemplo.
Este ejemplo para manejar todos los navegadores.
fuente
Solución simple
fuente
// Esto funciona en IE7, si está cerrando una pestaña o navegador con una sola pestaña
fuente
window.onunload = "alert('wait')"
ywindow.onbeforeunload = "alert('wait... chrome!')"
utilicé la consola en Chromium / Ubuntu, pero ninguno disparó cuando cerré la pestaña.window.onunload = "alert('wait')"
y tal no debería funcionar realmente. "La función debe asignar un valor de cadena a la propiedad returnValue del objeto Event y devolver la misma cadena". Por favor, eche un vistazo al artículo de MDNNecesitaba desconectar automáticamente al usuario cuando se cierra el navegador o la pestaña, pero no cuando el usuario navega a otros enlaces. Tampoco quería que se mostrara un mensaje de confirmación cuando eso sucede. Después de luchar con esto por un tiempo, especialmente con IE y Edge, esto es lo que terminé haciendo (comprobé trabajando con IE 11, Edge, Chrome y Firefox) después de basar el enfoque en esta respuesta .
Primero, inicie un temporizador de cuenta regresiva en el servidor en el
beforeunload
controlador de eventos en JS. Las llamadas ajax deben ser sincrónicas para que IE y Edge funcionen correctamente. También necesitas usarreturn;
para evitar que el cuadro de diálogo de confirmación se muestre así:Al iniciar el temporizador se establece la
cancelLogout
bandera en falso . Si el usuario actualiza la página o navega a otro enlace interno, elcancelLogout
indicador en el servidor se establece en verdadero . Una vez que transcurre el evento del temporizador, verifica lacancelLogout
bandera para ver si el evento de cierre de sesión se ha cancelado. Si el temporizador ha sido cancelado, entonces lo detendría. Si se cerró el navegador o la pestaña, lacancelLogout
bandera permanecería falsa y el controlador de eventos cerraría la sesión del usuario.Nota de implementación: estoy usando ASP.NET MVC 5 y estoy cancelando el cierre de sesión en un
Controller.OnActionExecuted()
método anulado .fuente
OnActionExecuted
?Lo sentimos, no pude agregar un comentario a una de las respuestas existentes, pero en caso de que quisiera implementar un tipo de diálogo de advertencia, solo quería mencionar que cualquier función de controlador de eventos tiene un argumento - evento. En su caso, puede llamar a event.preventDefault () para no dejar la página automáticamente, luego emita su propio diálogo. Considero que esta es una opción mucho mejor que usar una alerta estándar fea e insegura (). Personalmente implementé mi propio conjunto de cuadros de diálogo basados en el objeto kendoWindow (la interfaz de usuario Kendo de Telerik, que es casi completamente de código abierto, excepto kendoGrid y kendoEditor). También puede usar cuadros de diálogo desde jQuery UI. Sin embargo, tenga en cuenta que tales cosas son asíncronas, y deberá vincular un controlador al evento onclick de cada botón, pero todo esto es bastante fácil de implementar.
Sin embargo, estoy de acuerdo en que la falta del evento de cierre real es terrible: si, por ejemplo, desea restablecer el estado de su sesión en el back-end solo en el caso del cierre real, es un problema.
fuente
Para tareas similares, puede usar
sessionStorage
para almacenar datos localmente hasta que se cierre la pestaña del navegador.El
sessionStorage
objeto almacena datos para una sola sesión (los datos se eliminan cuando se cierra la pestaña del navegador). ( W3Schools )Esta es mi lapicera .
fuente
No hay ningún evento, pero hay una propiedad
window.closed
que es compatible con todos los principales navegadores en el momento de este escrito. Por lo tanto, si realmente necesita saber, puede sondear la ventana para verificar esa propiedad.if(myWindow.closed){do things}
Nota: Sondear cualquier cosa generalmente no es la mejor solución. El
window.onbeforeunload
evento debe usarse si es posible, la única advertencia es que también se dispara si te alejas.fuente
fuente
beforeunload
si desea mostrar una alerta. De esta manera:$(window).on('beforeunload', function(){ alert ('Bye now')});
Intenta usarlo:
fuente
Encontré una forma que funciona en todos mis navegadores .
Probado en las siguientes versiones: Firefox 57, Internet Explorer 11, Edge 41, uno de los últimos Chrome (no mostrará mi versión)
fuente
Como nadie lo ha mencionado todavía (más de 8 años después): un WebSocket puede ser otra forma efectiva de detectar una pestaña cerrada. Mientras la pestaña esté abierta y apunte al host, el cliente podrá mantener una conexión WebSocket activa al host.
Advertencia: Tenga en cuenta que esta solución realmente solo es viable para un proyecto si un WebSocket no requiere ningún gasto adicional significativo de lo que ya está haciendo.
Dentro de un período de tiempo de espera razonable (p. Ej., 2 minutos), el lado del servidor puede determinar que el cliente se ha ido después de que WebSocket se haya desconectado y realizar cualquier acción que desee, como eliminar los archivos temporales cargados. (En mi caso de uso extremadamente especializado, mi objetivo era terminar un servidor de aplicaciones localhost tres segundos después de que la conexión WebSocket se caiga y toda la actividad CGI / FastCGI finalice; cualquier otra conexión de mantenimiento no me afecta).
Tuve problemas para que el controlador de eventos onunload funcionara correctamente con balizas (como lo recomienda esta respuesta ). El cierre de la pestaña no pareció activar la baliza y las pestañas abiertas la activaron de maneras que podrían causar problemas. Un WebSocket resolvió el problema con el que me encontraba más limpiamente porque la conexión se cierra aproximadamente al mismo tiempo que la pestaña se cierra y el cambio de páginas dentro de la aplicación simplemente abre una nueva conexión WebSocket dentro de la ventana de retraso.
fuente
Enlace JSFiddle
Hola a todos, pude lograr clics en 'Detectar navegador y evento de cierre de pestaña' al usar el almacenamiento local del navegador y la marca de tiempo. Espero que todos ustedes resuelvan sus problemas utilizando esta solución.
Después de mi investigación inicial, descubrí que cuando cerramos un navegador, el navegador cerrará todas las pestañas una por una para cerrar completamente el navegador. Por lo tanto, observé que habrá muy poco tiempo de retraso entre el cierre de las pestañas. Así que tomé este retraso como mi principal punto de validación y pude lograr la detección de eventos de cierre de navegador y pestaña.
Lo probé en la versión 76.0.3809.132 del navegador Chrome y encontré que funcionaba
:) Vote si encuentra útil mi respuesta ...
fuente
fuente
here also can be string, that will be shown to the user
sin embargo, en Firefox, sí lo hace en Chrome ...Es posible verificarlo con la ayuda de window.closed en un controlador de eventos en el evento 'descargar' como este, pero se requiere el uso del tiempo de espera (por lo que no se puede garantizar el resultado si algo demora o evita que se cierre la ventana):
Ejemplo de JSFiddle (Probado en los últimos Safari, FF, Chrome, Edge e IE11)
fuente
He intentado todas las soluciones anteriores, ninguna de ellas realmente funcionó para mí, especialmente porque hay algunos componentes de Telerik en mi proyecto que tienen el botón 'Cerrar' para ventanas emergentes, y llama al evento 'beforeunload'. Además, el selector de botones no funciona correctamente cuando tiene una cuadrícula de Telerik en su página (me refiero a los botones dentro de la cuadrícula) Por lo tanto, no pude usar ninguna de las sugerencias anteriores. Finalmente esta es la solución que me funcionó. He agregado un evento onUnload en la etiqueta del cuerpo de _Layout.cshtml. Algo como esto:
y luego agregue la función LogOff para redirigir a Account / LogOff, que es un método incorporado en Asp.Net MVC. Ahora, cuando cierro el navegador o la pestaña, redirige al método LogOff y el usuario debe iniciar sesión cuando regrese. Lo he probado en Chrome y Firefox. ¡Y funciona!
fuente
Esta función muestra un cuadro de diálogo de confirmación si cierra una ventana o actualiza la página durante cualquier proceso en el navegador. Esta función funciona en todos los navegadores. Debe configurar isProcess var en su proceso ajax.
fuente
fuente
sendkeylog
?Como @jAndy mencionó, no hay un código JavaScript adecuado para detectar que se está cerrando una ventana. Partí de lo que @Syno había propuesto.
Pasé por una situación como esa y si sigues estos pasos, podrás detectarlo.
Lo probé en Chrome 67+ y Firefox 61+.
};
fuente
resize
cuando la ventana esté borrosa. Si se vuelve borroso 100x, entonces tendrás 100 oyentes, lo que terminará ralentizando el navegador.prueba esto, estoy seguro de que esto funcionará para ti.
fuente
Prueba esto. Funcionará. El método de descarga jquery está desactualizado.
fuente