Malheureusement, kangax's answer ne fonctionne pas pour Safari on iOS. Dans mes tests beforeunload
a été pris en charge dans tous les navigateurs j'ai essayé exactement sauf Safari sur iOS :-(
Au lieu de cela, je suggère une approche différente.
L'idée est simple sur la première visite de la page, nous ne sommes pas réellement savoir encore si beforeunload
est pris en charge. Mais cette première page, nous mettons en place à la fois un unload
et un gestionnaire beforeunload
. Si le feu gestionnaire beforeunload
, nous avons mis un drapeau disant que beforeunload
est pris en charge (en fait beforeunloadSupported = "yes"
). Lorsque les unload
incendies de gestionnaire, si le drapeau n'a pas été défini, nous avons mis le drapeau que beforeunload
est pas pris en charge.
Dans ce qui suit, nous allons utiliser localStorage
(pris en charge dans tous les navigateurs que je garde au sujet - voir http://caniuse.com/namevalue-storage) pour obtenir/définir le drapeau. Nous aurions tout aussi bien pu utiliser un cookie, mais j'ai choisi localStorage
parce que n'a aucune raison d'envoyer cette information au serveur web à chaque requête. Nous juste besoin d'un drapeau qui survit à recharges de page. Une fois que nous l'avons détecté une fois, il restera détecté pour toujours.
Avec ceci, vous pouvez maintenant appeler isBeforeunloadSupported()
et il vous le dira.
(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);
Voici un exemple complet de avec l'exemple d'utilisation.
Notez qu'il n'a été détecté que sur le second ou les chargements de pages suivants sur votre site. S'il est important pour vous de le faire fonctionner sur la toute première page, vous pouvez charger un iframe
sur cette page avec un attribut src
pointant vers une page du même domaine avec la détection ici, assurez-vous qu'il a été chargé puis supprimé il. Cela devrait assurer que la détection a été faite, donc isBeforeunloadSupported()
fonctionne même sur la première page. Mais je n'avais pas besoin de ça alors je ne l'ai pas mis dans ma démo.
fonctionne parfaitement merci pour le partage – jansokoly
Le site qui est lié à ci-dessus vers le bas? Ne fonctionne pas pour moi mais j'ai trouvé une [version en cache] (http://webcache.googleusercontent.com/search?q=cache:http://perfectionkills.com/detecting-event-support-without-browser-sniffing /). – regularmike
Attention: J'ai écrit un commentaire sur la page [@ kangax] (http://perfectionkills.com/detecting-event-support-without-browser-sniffing/#comment-468226) spécifiquement sur 'onbeforeunload' étant détecté comme supporté sur Mobile Safari même s'il [ne fonctionne pas réellement] (http://stackoverflow.com/questions/3239834/window-onbeforeun-not-working-on-the-ipad). –