79 votes

window.onbeforeunload et window.onunload ne fonctionnent pas dans Firefox, Safari, Opera ?

Dans mon application de chat, j'ai besoin d'obtenir la confirmation de l'utilisateur, lorsque mon application se ferme.

J'ai donc utilisé le window.onbeforeunload pour l'alerte de confirmation et window.onunload pour logout() .

  1. Mais les deux fonctions fonctionnent dans IE et Chrome. (L'application fonctionne bien)

  2. window.onbeforeunload ne fonctionne pas dans Opera et mon message ne s'affiche pas dans Firefox.

  3. window.onunload ne fonctionne pas dans Safari, Opera et Firefox.

Mon code JavaScript sera :

// Used for confirmation, to closing the window 
window.onbeforeunload = function () {

    return  "Are you sure want to LOGOUT the session ?";
}; 

// Used to logout the session, when browser window was closed 
window.onunload = function () {

    if((sessionId != null)&&(sessionId!="null")&& (sessionId != ""))
        logout();
};

J'ai également essayé la même fonction avec JQuery,

<script type="text/javascript">

    $(window).on('beforeunload', function() {
        return 'Are you sure want to LOGOUT the session ?';
    });

    $(window).unload(function() {
        if ((sessionId != null) && (sessionId != "null") && (sessionId != "")) {
            logout();
        }
    });

</script>

0 votes

Cela fonctionne sur mon Firefox, sauf que le message n'est pas celui que vous avez envoyé. jsfiddle.net/yhx6d

0 votes

Merci pour votre réponse ... Oui, le message ne s'affiche pas. déconnexion() ne fonctionne pas. Cela signifie que window.onunload() ne fonctionne pas ?

0 votes

window.onbeforeunload et window.onunload ne fonctionne pas dans Opera ?

100voto

Freakyuser Points 867

Malheureusement, les méthodes que vous utilisez ne sont pas prises en charge par ces navigateurs. Pour appuyer ma réponse (ce comportement non supporté), j'ai donné les liens ci-dessous.

onbeforeunload et onunload ne fonctionne pas dans opera ... pour soutenir cette

onbeforeunload dans Opera
http://www.zachleat.com/web/dont-let-the-door-hit-you-onunload-and-onbeforeunload/

Bien que le onunload ne fonctionne pas complètement, vous pouvez utiliser l'événement onunload pour afficher un avertissement si un utilisateur clique sur un lien pour quitter une page contenant un formulaire non sauvegardé.

onunload ne fonctionne pas dans safari ... pour soutenir cette

https://www.webkit.org/blog/516/webkit-page-cache-ii-the-unload-event/

Vous pouvez plutôt essayer d'utiliser le pagehide dans le navigateur safari au lieu de onunload .

onunload ne fonctionne pas dans firefox ... pour soutenir cette

https://bugzilla.mozilla.org/show_bug.cgi?id=681636

Ils doivent encore trouver une solution pour les FF également.

Je vous souhaite bonne chance.

42 votes

J'ai donné +50 Une prime pour vous. Parce que vous avez beaucoup travaillé pour obtenir cette réponse suggérée. Et elle est utile pour d'autres questions.

3 votes

Des mises à jour ? toujours pas de support ?, des solutions de contournement ?

0 votes

Le lien que vous avez partagé pour soutenir l'affirmation selon laquelle onunload ne fonctionne pas dans firefox, c'est uniquement lorsque la page est dans une situation de popup. "window.onUnload ne fonctionne pas quand la page est dans une popup"

43voto

user3253009 Points 181

Voici la solution qui fonctionne pour ie, firefox et chrome :

var myEvent = window.attachEvent || window.addEventListener;
var chkevent = window.attachEvent ? 'onbeforeunload' : 'beforeunload'; /// make IE7, IE8 compitable

            myEvent(chkevent, function(e) { // For >=IE7, Chrome, Firefox
                var confirmationMessage = 'Are you sure to leave the page?';  // a space
                (e || window.event).returnValue = confirmationMessage;
                return confirmationMessage;
            });

0 votes

@user3253009.comment trouvez-vous la réponse ici ?

0 votes

Quelle réponse @KumarHarsh ?

0 votes

@user3253009, lorsque la pop up apparaît avec "Rester sur la page" ou "Quitter la page", pouvons-nous attraper la réponse si l'utilisateur a cliqué sur quel bouton ?

17voto

nathan hayfield Points 1419

J'ai réussi à le faire fonctionner dans IE et FF avec des jQuery's :

$(window).bind('beforeunload', function(){

});

au lieu de : unload, onunload, ou onbeforeunload

0 votes

@JavaPlayer Cela semble fonctionner pour moi dans firefox 26.x... Avez-vous recherché d'autres erreurs javascript ? Cela continue de fonctionner pour moi.

0 votes

@nathanhayfield Cela fonctionne bien, mais il y a une pop up. Comment puis-je l'ignorer ?

0 votes

@nathanhayfield j'ai aussi essayé et il y a une alerte pour la confirmation. Pourquoi s'affiche-t-elle ? Il n'y a pas d'alerte dans ma fonction ou mon code.

14voto

Human Being Points 1403

J'ai obtenu la solution pour onunload dans tous les navigateurs, sauf Opera, en transformant la demande asynchrone Ajax en demande synchrone.

xmlhttp.open("POST","LogoutAction",false);

Il fonctionne bien pour tous les navigateurs, sauf Opéra .

0 votes

Cela fonctionne dans firefox, mais malheureusement mdn dit il est censé être déprécié

6voto

leeway Points 376

L'événement onunload n'est pas appelé dans tous les navigateurs. Pire encore, vous ne pouvez pas vérifier la valeur de retour de l'événement onbeforeunload. Cela nous empêche d'exécuter réellement une fonction de déconnexion.

Cependant, vous pouvez contourner ce problème.

Appelez la déconnexion en premier lieu dans l'événement onbeforeunload, puis invitez l'utilisateur. Si l'utilisateur annule sa déconnexion, il se reconnecte automatiquement, en utilisant l'événement onfocus. Un peu à l'envers, mais je pense que ça devrait marcher.

'use strict';

var reconnect = false;

window.onfocus = function () {
  if (reconnect) {
    reconnect = false;
    alert("Perform an auto-login here!");
  }
};

window.onbeforeunload = function () {
  //logout();
  var msg = "Are you sure you want to leave?";
  reconnect = true;
  return msg;
};

3 votes

Il semble que ce soit très dangereux. Pour être en mesure de reconnecter automatiquement l'utilisateur, les informations d'identification doivent être stockées dans le navigateur, ce qui permet à un utilisateur déconnecté d'être connecté par n'importe qui.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X