Desafortunadamente kangax's answer no funciona para Safari on iOS. En mis pruebas beforeunload
fue apoyado en todos los navegadores Probé exactamente excepto Safari en iOS :-(
lugar Sugiero un enfoque diferente:.
La idea es simple en la primera visita la página, no lo hacemos en realidad sabemos todavía si se admite beforeunload
. Pero en esa primera página, hemos creado tanto un unload
y una beforeunload
manejador. Si los beforeunload
incendios de controlador, que establece un indicador diciendo que beforeunload
se apoya (en realidad beforeunloadSupported = "yes"
). Cuando el controlador unload
se activa, si no se ha establecido el indicador, configuramos el marca que beforeunload
es no compatible.
A continuación utilizaremos localStorage
(compatible con todos los navegadores que me importan - vea http://caniuse.com/namevalue-storage) para obtener/configurar la bandera. Nosotros podríamos haber usado una cookie, pero elegí localStorage
porque no es razón para enviar esta información al servidor web en cada solicitud. Nosotros solo necesitamos una bandera que sobreviva a las recargas de página. Una vez que lo hayamos detectado una vez, se mantendrá detectado por .
Con esto, ahora puede llamar al isBeforeunloadSupported()
y le avisará.
(function($) {
var field = 'beforeunloadSupported';
if (window.localStorage &&
window.localStorage.getItem &&
window.localStorage.setItem &&
! window.localStorage.getItem(field)) {
$(window).on('beforeunload', function() {
window.localStorage.setItem(field, 'yes');
});
$(window).on('unload', function() {
// If unload fires, and beforeunload hasn't set the field,
// then beforeunload didn't fire and is therefore not
// supported (cough * iPad * cough)
if (! window.localStorage.getItem(field)) {
window.localStorage.setItem(field, 'no');
}
});
}
window.isBeforeunloadSupported = function() {
if (window.localStorage &&
window.localStorage.getItem &&
window.localStorage.getItem(field) &&
window.localStorage.getItem(field) == "yes") {
return true;
} else {
return false;
}
}
})(jQuery);
Aquí hay un completo jsfiddle con uso de ejemplo.
Tenga en cuenta que solo se detectará en la segunda página o en las siguientes cargas de página en su sitio. Si también es importante tenerlo trabajando en la primera página, puede cargar un iframe
en esa página con un atributo src
apuntando a una página en el mismo dominio con la detección aquí, asegúrese de que se haya cargado y luego eliminar eso. Eso debería garantizar que la detección se haya realizado para que isBeforeunloadSupported()
funcione incluso en la primera página. Pero no lo necesitaba, así que no lo puse en mi demo.
funciona a la perfección gracias por compartir – jansokoly
¿El sitio está vinculado a arriba? No funciona, pero encontré una [versión en caché] (http://webcache.googleusercontent.com/search?q=cache:http://perfectionkills.com/detecting-event-support-without-browser-sniffing /). – regularmike
Advertencia: escribí un comentario en la página [@ kangax] (http://perfectionkills.com/detecting-event-support-without-browser-sniffing/#comment-468226) específicamente sobre la detección de 'onbeforeunload' como compatible con Mobile Safari a pesar de que [en realidad no funciona de manera confiable] (http://stackoverflow.com/questions/3239834/window-onbeforeunload-not-working-on-the-ipad). –