Puede detectar hipervínculos clics, pero no se puede determinar si el usuario:
- trataban de actualizar la página.
- Se ha intentado cerrar la pestaña del navegador.
- Se ha intentado cerrar la ventana del navegador.
- Ingresó otra URL en la barra de la URL y presionó enter.
Todas estas acciones generan beforeunload
evento en window
, sin ninguna información más exacta sobre el evento.
Con el fin de mostrar diálogo de confirmación cuando se hace por encima de las acciones, y no mostrarlo cuando se hace clic en un hipervínculo, siga estos pasos:
- Asignar
beforeunload
detector de eventos a window
, que devuelve el texto de confirmación como una cadena, a menos que una variable específica (indicador) esté configurada en true
.
- Asignar
click
evento al document
. Compruebe si se ha hecho clic en el elemento a
(event.target.tagName
). En caso afirmativo, establezca el indicador en true
.
También debe manejar los envíos de formularios mediante la asignación de un oyente submit
evento para document
.
Su código podría tener este aspecto:
let disableConfirmation = false;
window.addEventListener('beforeunload', event => {
const confirmationText = 'Are you sure?';
if (!disableConfirmation) {
event.returnValue = confirmationText; // Gecko, Trident, Chrome 34+
return confirmationText; // Gecko, WebKit, Chrome <34
} else {
// Set flag back to false, just in case
// user stops loading page after clicking a link.
disableConfirmation = false;
}
});
document.addEventListener('click', event => {
if (event.target.tagName.toLowerCase() === 'a') {
disableConfirmation = true;
}
});
document.addEventListener('submit', event => {
disableConfirmation = true;
});
<p><a href="https://stacksnippets.net/">google.com</a></p>
<form action="https://stacksnippets.net/"><button type="submit">Submit</button></form>
<p>Try clicking the link or the submit button. The confirmation dialog won't be displayed.</p>
<p>Try reloading the frame (right click -> "Reload frame" in Chrome). You will see a confirmation dialog.</p>
Tenga en cuenta que en algunos navegadores que hay que utilizar en event.returnValue
beforeunload
oyente, y en otros se utilice return
comunicado.
Véase también beforeunload
event docs.
Votaron para reabrir. El duplicado vinculado no responde la pregunta, pero las respuestas aquí sí. – Heinzi
FWIW, vendré a apuñalarte con el dedo meñique si colocas este comportamiento en cualquier aplicación que tenga que usar. Secuestrar el navegador es una maravillosa solución para este problema. ¿No puedes usar AJAX o algo así y guardar automáticamente su estado? – Graham
No estoy de acuerdo con Graham: a veces, todo lo que necesita es una advertencia/confirmación. De acuerdo, esto puede (y a menudo lo es) ser abusado por sitios que intentan evitar que usted se vaya, pero si se lo emplea correctamente, puede ser muy apreciado, por ejemplo, si olvida publicar algo. – devios1