Leider funktioniert kangax's answer nicht für Safari on iOS. In meinen Tests beforeunload
wurde in jedem Browser unterstützt ich genau, außer Safari auf IOS versucht :-(
Stattdessen schlage ich einen anderen Ansatz.
Die Idee ist einfach auf der ersten Seite besucht, wissen wir nicht weiß eigentlich noch, wenn beforeunload
unterstützt wird. Aber an dieser ersten Seite, wir gründeten einen beide unload
und einen beforeunload
Handler. wenn das beforeunload
Handler Feuer, wir Flag gesetzt sagen, dass beforeunload
unterstützt wird (tatsächlich beforeunloadSupported = "yes"
). wenn Der unload
Handler wird ausgelöst, wenn das Flag nicht gesetzt wurde, setzen wir flag, dass beforeunload
ist nicht unterstützt.
Im Folgenden verwenden wir localStorage
(unterstützt in allen Browsern, die ich interessiere über - siehe http://caniuse.com/namevalue-storage), um das Flag zu erhalten/setzen. Wir hätten genauso gut einen Cookie verwenden können, aber ich habe localStorage
gewählt, weil dort kein Grund ist, diese Informationen bei jeder Anfrage an den Webserver zu senden. Wir brauchen nur eine Flagge, die Seiten neu lädt überlebt. Sobald wir es einmal erkannt haben, bleibt es für immer erkannt.
Mit diesem können Sie jetzt anrufen isBeforeunloadSupported()
und es wird Ihnen sagen.
(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);
Hier ist ein voller jsfiddle mit Beispielverwendung.
Beachten Sie, dass es nur beim zweiten oder nachfolgenden Laden Ihrer Website erkannt wurde. Wenn es wichtig ist, dass es auch auf der allerersten Seite funktioniert, können Sie iframe
auf dieser Seite mit einem src
-Attribut laden, das auf eine Seite in derselben Domäne mit der Erkennung hier zeigt, stellen Sie sicher, dass es geladen und dann entfernt wurde es. Das sollte sicherstellen, dass die Erkennung erfolgt ist, so funktioniert isBeforeunloadSupported()
sogar auf der ersten Seite. Aber ich brauchte das nicht, also habe ich das nicht in meine Demo aufgenommen.
funktioniert nahtlos danke für die gemeinsame Nutzung – jansokoly
Ist die Seite, die oben verlinkt ist? Funktioniert nicht für mich, aber ich fand eine [Cache-Version] (http://webcache.googleusercontent.com/search?q=cache:http://perfectionkills.com/detecting-event-support-without-browser-sniffing /). – regularmike
Warnung: Ich habe einen Kommentar auf [@ kangax's page] (http://perfectionkills.com/detecting-event-support-without-browser-sniffing/#comment-468226) geschrieben, speziell darüber, dass 'onbeforeunload' auf Mobilgeräten erkannt wird Safari obwohl es [tatsächlich nicht zuverlässig funktioniert] (http://stackoverflow.com/questions/3239834/window-onbeforeunload-not-working-on-the-ipad). –