web-dev-qa-db-fra.com

Différence entre onbeforeunload et onunload

Quelles sont les différences entre onbeforeunload et onunload? J'ai aussi une question spécifique liée à son utilisation sur l'iPad ... J'ai une page (maPage.html) où j'essaie d'afficher une alerte lorsque la page est fermée (c'est-à-dire que X est pressé pour fermer l'onglet sur l'iPad)

Maintenant, j'ai essayé d'utiliser à la fois window.onunload et window.onbeforeunload Voici mes découvertes sur l'iPad;

  1. En utilisant window.onunload, je peux recevoir une alerte lorsque l'utilisateur accède à une page différente de myPage.html (soit en cliquant sur un lien, soit en effectuant une recherche Google sur myPage.html). Cependant, rien ne se passe lorsque l'onglet est fermé de la vue réduite (X)

  2. En utilisant window.onbeforeunload, je ne reçois aucune alerte même si l'utilisateur accède à une page différente de myPage.html OR s'il ferme l'onglet (X) de la vue minimisée.

Je voulais savoir s'il existe un autre moyen de résoudre ce problème?

Je vous remercie.

35
testndtv

onunload est responsable de l'exécution d'une instruction lorsque la page est fermée. Cela provoque également des problèmes avec IE et AJAX.

onbeforeunload est plus efficace car il ne s'exécute pas en concurrence avec la fermeture effective de la fenêtre et se déclenche avant onunload

Je sais Opera utilisé pour ne pas reconnaître onbeforeunload - je ne sais pas s'ils ont corrigé cela, mais j'enregistre toujours l'auditeur pour que les deux soient en sécurité:

window.onunload = window.onbeforeunload = (function(){...
16
AlienWebguy

Ajout avec les ans d'AlienWebguy, pour éviter les doubles appels sur les navigateurs qui prennent en charge les deux événements,

var onBeforeUnLoadEvent = false;

window.onunload = window.onbeforeunload= function(){
if(!onBeforeUnLoadEvent){
  onBeforeUnLoadEvent = true;
  //your code here
  }
};
19
noboundaries

onbeforeunload:

  • Appelé avant le début du déchargement
  • MDN me dit vous pouvez annuler la fermeture de la page en utilisant event.preventDefault();
  • ou en renvoyant une valeur non nulle (c'est-à-dire une valeur! = 0), la page affichera une boîte de dialogue de confirmation qui permet à l'utilisateur de choisir d'annuler la fermeture
  • MDN dit également Opera 12 et plus de support onbeforeunload - on dirait qu'il le supporte depuis un moment maintenant

onunload:

  • Appelé après le début du déchargement, mais avant toute désallocation de ressources (ce n'est pas clair pour moi ce que exactement a fait pendant cette période)
  • Il est trop tard pour annuler la fermeture de la page à ce stade

La seule raison pour laquelle je peux penser pourquoi vous voudriez utiliser onunload sur onbeforeunload serait que votre code onunload pourrait prendre un certain temps, et ne veut pas que l'utilisateur pour voir une fenêtre qui se bloque lors de la fermeture.

10
B T

Une différence significative (autre que l'annulation) entre les onbeforeunload et onunload est que la première est déclenchée pour les liens de téléchargement et la seconde ne l'est pas. Exemple: <a href="https://somewhere.com/thething.Zip">download</a> déclenchera le gestionnaire onbeforeunload, mais pas le onunload.

8
dvdplm