¿Alguien sabe si el onbeforeunload
evento es compatible con el iPad y / o si hay una forma diferente de usarlo?
Probé casi todo y parece que el onbeforeunload
evento nunca se activa en el iPad (navegador Safari).
Específicamente, esto es lo que he probado:
window.onbeforeunload = function(event) { event.returnValue = 'test'; }
window.onbeforeunload = function(event) { return 'test'; }
- (ambos de los anteriores juntos)
window.onbeforeunload = function(event) { alert('test')'; }
- (todas las funciones anteriores pero dentro
<body onbeforeunload="...">
Todos estos funcionan en FF y Safari en la PC, pero no en el iPad.
Además, hice lo siguiente justo después de cargar la página:
alert('onbeforeunload' in window);
alert(typeof window.onbeforeunload);
alert(window.onbeforeunload);
Respectivamente, los resultados son:
true
object
null
Entonces, el navegador tiene la propiedad, pero por alguna razón no se activa.
Las formas en las que trato de navegar fuera de la página son haciendo clic en los botones de retroceso y avance, haciendo una búsqueda en Google en la barra superior, cambiando la ubicación en la barra de direcciones y haciendo clic en un marcador.
¿Alguien tiene alguna idea de lo que está pasando? Agradecería mucho cualquier aporte.
Gracias
fuente
addEventListener()
?beforeunload
que no funciona en Safari en iOS. :-( Quizás no sea lo que está buscando, pero tengo una sugerencia sobre cómo probar de manera confiable para un funcionamientobeforeunload
window.onbeforeunload = function(event) { event.returnValue = 'test'; }
no funciona tanto en Chrome como en Safari de iOS 9.2.1. Me gusta muchoonbeforeunload
porque la página no cambia si hago clic en cancelar.Respuestas:
Descubrí que el evento onunload () se activa. Su comportamiento es algo extraño; lo que sea que tenga en su función de devolución de llamada adjunta al evento se ejecuta realmente después de que la nueva página se haya cargado en segundo plano (no puede saber si está cargada todavía, pero el registro del servidor mostrará que sí).
Más curiosamente, si tiene una llamada confirm () en su onunload (), y el usuario ha hecho clic en un enlace para ir a otro lugar, está en el negocio. Sin embargo, si el usuario cierra la pestaña del navegador Safari del iPad, el evento onunload () se activará, pero su confirm () tendrá una cancelación implícita como respuesta.
fuente
unload
evento obsoleto a favor depagehide
ver developer.apple.com/library/ios/documentation/AppleApplications/…Este fragmento de JavaScript me funciona en Safari y Chrome en ipad y iphone, así como en computadoras de escritorio / portátiles / otros navegadores:
var isOnIOS = navigator.userAgent.match(/iPad/i)|| navigator.userAgent.match(/iPhone/i); var eventName = isOnIOS ? "pagehide" : "beforeunload"; window.addEventListener(eventName, function (event) { window.event.cancelBubble = true; // Don't know if this works on iOS but it might! ... } );
fuente
return 'test';
similar a eso porSolo Apple lo sabría con certeza, pero supongo que deliberadamente no habilitaron esa funcionalidad en Safari móvil porque los personajes turbios la utilizan con mayor frecuencia para que permanezcas en su sitio o aparezcan muchas ventanas de pornografía / publicidad.
fuente
Hay un error conocido en WebKit con onbeforeunload. Creo que está solucionado en la última versión beta de Chrome 5, pero es muy posible que el navegador del iPad esté hecho de una versión de WebKit que no tiene la solución.
Informe de errores de Chrome relacionado .
fuente
El evento beforeunload no es compatible con Mobile Safari. Puede ver la lista de todos los eventos admitidos aquí: Manejo de eventos Documentación de Apple
¡Y la descarga previa no está en la lista!
fuente
https://code.google.com/p/chromium/issues/detail?id=97035
ver escuchar.
Creo que las alertas, la solicitud, la confirmación y otras acciones como estas tampoco están permitidas.
fuente
Si solo necesita saber si la página se ha abandonado, puede usar
document.unload
. Funciona bien en los navegadores iOS. Si ve en la documentación de Apple , encontrará que está obsoleta y recomiendan usar document.pagehidefuente
Aquí hay una solución que debería funcionar en todos los navegadores modernos:
var unloaded = false; window.addEventListener("beforeunload", function(e) { if (unloaded) return; unloaded = true; console.log("beforeUnload"); }); window.addEventListener("visibilitychange", function(e) { if (document.visibilityState == 'hidden') { if (unloaded) return; unloaded = true; console.log("beforeUnload"); } });
Los navegadores móviles no tienden a no ser compatibles
beforeunload
porque el navegador puede pasar a segundo plano sin descargar la página y luego ser eliminado por el sistema operativo en cualquier momento.La mayoría de los navegadores de escritorio contienen un error que hace
visibilityState
que no se llame cuando se descarga el documento. Ver: aquí .Por lo tanto, es importante incluir ambos eventos para cubrir todos los escenarios.
nótese bien
Lo he usado en
console.log
lugar dealert
en mi ejemplo porquealert
algunos navegadores lo bloquearán cuando se llame desdebeforeunload
ovisibilitychange
.fuente