¿Cómo evitar las alertas de JavaScript que se activan al salir de una página?

12

Muchas páginas tienen alertas cuando las abandonas: si cierras pestañas, navegas sin guardar, etc., existen numerosas razones por las que un sitio te alertaría / bloquearía tu salida hasta que confirmes una alerta, por ejemplo, "¿Estás seguro de que quieres navegar fuera de esta página? ".

Esto normalmente se hace con los controladores onbeforeunloady / o onunloadcontroladores.

Aquí hay un ejemplo.

¿Hay alguna manera de evitar alertas / eventos de bloqueo de usuarios generados por esos controladores? Básicamente, me gustaría dejar JS habilitado, y específicamente no permitir cosas que me impidan salir de una página sin que ocurra un clic adicional.

onbeforeunloady los onunloadmanipuladores aún deben disparar; simplemente no se les debe permitir hacer cosas que bloqueen al usuario. Eso significa que no hay alertas ni operaciones que demoren más de unos segundos.

He encontrado algunos complementos que editan / greasemonkey parchean el javascript para páginas particulares, y jugué un poco con su código para intentar hacerlos más universalmente aplicables. Sin embargo, espero encontrar una solución que funcione en cualquier página que intente bloquear la salida del usuario.

Zac B
fuente
¿Puedes publicar una URL que haga eso?
golimar
Editado, ejemplo agregado. Además, entiendo por qué este comportamiento es a menudo deseable, y que es necesario para evitar la pérdida accidental de datos en muchos casos. Todavía me gustaría saber cómo anularlo / deshabilitarlo.
Zac B
Nota: toda la respuesta actual (que modifica onbeforeunload) solo funcionará para páginas que usan onbeforeunload, no para páginas que usan uno de los otros métodos para adjuntar eventos.
Synetech

Respuestas:

7

Bueno, lo más simple es simplemente anular el script de páginas directamente y reasignar el evento a null.

window.onbeforeunload = null;

Esto debería funcionar en cualquier lugar, a menos que sean verdaderamente maliciosos, y seguir reasignándolo ellos mismos. En tal caso, un ciclo para mantener la configuración nullprobablemente funcionará.

while(true) {
    if (window.onbeforeunload != null) {
        window.onbeforeunload = null;
    }
}

Ahora, ten cuidado, algunas páginas usan esto para siempre. Tome la página de carga de YouTube: si navega fuera durante una carga, ¡puede haber perdido horas de progreso! O tal vez un formulario web que está completando, que tal vez no desee volver a completar, o un mensaje (foro / correo electrónico) que no desee volver a escribir. Con esta característica, estás protegido.

Otro problema es cualquier página que use esto para algún propósito secundario, como guardar datos por AJAX. Pueden usar este evento para activar la acción de guardar, y esperan que el usuario tarde lo suficiente en hacer clic en el botón para que se complete la solicitud. Nuevamente, esto a menudo se hace para salvarte de ti mismo.

Pero, obviamente, todos sabemos que muchas páginas usan esto por enfermedad. Entonces, si conoce alguna página en la que desea que funcione, siempre podría tener un sistema de lista blanca. Realmente no hay una manera de bloquear esta acción, sin un bloqueo total window.onbeforeunload, y cualquier acción (posiblemente buena) que pueda tomar.

No hay forma (sin el conocimiento previo de un código de página dado) para mantener las buenas acciones mientras se detiene el cuadro emergente. Este cuadro no es un alert(). El navegador genera el cuadro, como el comportamiento previsto de onbeforeunload. Uno lo crea haciendo cualquier función que asignen para window.onbeforeunloaddevolver una cadena. Esa cadena se imprimirá en la ventana emergente.

window.onbeforeunload = function() {
    //Whatever
    return "WARNING! You have unsaved changes that may be lost!";
}

Por lo tanto, no podrá bloquear la ventana emergente sin borrar la función.

Además, si encontraste una manera, cualquier AJAX fallaría. La ventana emergente le da tiempo a las solicitudes para pasar, sin ella, se pueden perder datos.

En cuanto a onunload, no debería ser posible bloquearlo con esto. Ya que se dispara después de que la página se descarga. Pero para estar seguro, siempre se puede hacer window.onunload = null;y se debe tener cuidado.

zeel
fuente
Ese tipo de trabajo funciona, pero ¿y si el onbeforeunloadcontrolador hiciera algo más importante? Por ejemplo, ¿qué pasaría si hiciera una breve solicitud de AJAX o confirmara algo al almacenamiento HTML5 local? ¿Hay alguna manera de evitar que los onbeforeunloadmanejadores realicen ciertas llamadas (es decir alert()), o que se ejecuten por más de un período de tiempo determinado? Es por eso que pregunté acerca de una extensión en lugar de solo un script de tipo greasemonkey: parece que, para hacer esto correctamente, tendría que haber algo cambiado en el nivel del motor de JavaScript.
Zac B
1
He agregado más información. En cuanto a arreglar esto en un nivel inferior, las extensiones no son en realidad un nivel inferior. Tienen permisos más altos y algunas API especiales, pero carecen de la capacidad de cambiar las funciones principales del navegador. No estoy seguro de cuán profundo puede llegar el taponamiento FF, no tengo experiencia en esa área. Obviamente, al ser de código abierto, podrías hacer esos cambios. Pero eso va un poco lejos para arreglar una ventana emergente.
zeel
No funciona para mí :(
Phuc Nguyen
0
    // ==/UserScript==

var th = document.getElementsByTagName('body')[0];
var s = document.createElement('script');
s.setAttribute('type','text/javascript');
s.innerHTML = "window.onbeforeunload = function() {}";
th.appendChild(s);
cualquiera
fuente
1
¿Por qué alguna vez crearías un script como este?
Brad
3
@anywho. Puede ser útil si intenta explicar su guión para ayudar a otros a saber lo que están haciendo. Esto también le permitiría a muchos utilizar la respuesta, ya que una parte específica del guión puede alterarse para mejorar el guión o una pieza puede usarse en un guión completamente diferente. También es una buena idea explicar su respuesta de todos modos para ayudar a las personas a saber cómo se aplica a su pregunta. Sin embargo, gracias por publicar tu respuesta.
David
0

Hay una buena herramienta que puede manejar cualquier ventana emergente molesta en un sistema Windows: ClickOff . Puedes descargarlo desde aquí . Lo verifiqué y funciona con la alerta "Los cambios que realizó no se pueden guardar" para el sitio de SharePoint.

Serhiy
fuente