Détecter la fermeture du navigateur ou de l'onglet

y a-t-il un code JavaScript/jQuery pour navigateur croisé pour détecter si le navigateur ou un onglet du navigateur est fermé, mais pas en raison d'un lien cliqué?

222
demandé sur Xufox 2010-10-08 12:34:16

18 réponses

Si je reçois correctement, vous souhaitez savoir quand un onglet/fenêtre est effectivement fermé. Bien, AFAIK le seul moyen dans Javascript pour détecter ce genre de choses sont onunload et onbeforeunload événements.

Malheureusement (ou heureusement?), ces évènements sont également déclenchés lorsque vous quittez un site via un bouton link ou votre navigateur. Donc c'est la meilleure réponse que je puisse donner, Je ne pense pas que vous pouvez détecter nativement un pur close en Javascript. Corrigez-moi si Je suis mal ici.

211
répondu jAndy 2014-04-22 09:17:05

From Firefox Documentation

pour certaines raisons, les navigateurs Webkit ne suivent pas les spécifications de la boîte de dialogue. Un exemple presque transversal serait proche de l'exemple ci-dessous.

window.addEventListener("beforeunload", function (e) {
  var confirmationMessage = "\o/";

  (e || window.event).returnValue = confirmationMessage; //Gecko + IE
  return confirmationMessage;                            //Webkit, Safari, Chrome
});

cet exemple concerne tous les navigateurs.

96
répondu mohamed-ibrahim 2014-04-15 03:40:49

Solution Simple

window.onbeforeunload = function () {
    return "Do you really want to close?";
};
37
répondu 2014-05-21 09:53:48
<body onbeforeunload="ConfirmClose()" onunload="HandleOnClose()">

var myclose = false;

function ConfirmClose()
{
    if (event.clientY < 0)
    {
        event.returnValue = 'You have closed the browser. Do you want to logout from your application?';
        setTimeout('myclose=false',10);
        myclose=true;
    }
}

function HandleOnClose()
{
    if (myclose==true) 
    {
        //the url of your logout page which invalidate session on logout 
        location.replace('/contextpath/j_spring_security_logout') ;
    }   
}

/ / ceci fonctionne dans IE7, si vous fermez l'onglet ou le navigateur avec un seul onglet

14
répondu jyothis 2011-04-08 10:22:58

Désolé, je n'ai pas été en mesure d'ajouter un commentaire à l'une des réponses existantes, mais dans le cas où vous vouliez mettre en œuvre une sorte de dialogue d'avertissement, je voulais juste mentionner que toute fonction de gestionnaire d'événements a un argument - événement. Dans votre cas, vous pouvez appeler l'événement.preventDefault () pour refuser de quitter la page automatiquement, puis lancer votre propre dialogue. Je considère que c'est une meilleure option que d'utiliser standard ugly et insecure alert(). J'ai personnellement mis en place mon propre ensemble de boîtes de dialogue basées sur objet kendoWindow (Kendo UI de Telerik, qui est presque entièrement open-sourced, sauf de kendoGrid et kendoEditor). Vous pouvez également utiliser les boîtes de dialogue de jQuery UI. Notez cependant que de telles choses sont asynchrones, et vous aurez besoin de lier un handler à l'évènement onclick de chaque bouton, mais tout cela est assez facile à implémenter.

cependant, je suis d'accord que l'absence de l'événement proche réel est terrible: si vous, par exemple, voulez réinitialiser votre état de session à la fin seulement en cas de vraie fermeture, c'est un problème.

5
répondu Alex Iurovetski 2014-07-19 02:11:05
$(window).unload( function () { alert("Bye now!"); } );
3
répondu Poonam Bhatt 2012-11-26 08:48:02

il n'y a pas d'événement, mais il y a une propriété window.closed qui est prise en charge dans tous les principaux navigateurs au moment de la rédaction du présent document. Ainsi, si vous aviez vraiment besoin de savoir que vous pourriez sonder la fenêtre pour vérifier cette propriété.

if(myWindow.closed){do things}

Note: Interrogation rien n'est généralement pas la meilleure solution. L'événement window.onbeforeunload doit être utilisé si possible, la seule mise en garde étant qu'il déclenche aussi si vous naviguez loin.

3
répondu dlsso 2016-04-04 21:41:12

j'ai dû automatiquement déconnecter l'utilisateur lorsque le navigateur ou l'onglet ferme, mais pas lorsque l'utilisateur navigue vers d'autres liens. Je ne voulais pas un message de confirmation est affiché lorsque cela se produit. Après avoir lutté avec cela pendant un certain temps, en particulier avec IE et Edge, voici ce que j'ai fini de faire (coché travailler avec IE 11, Edge, Chrome, et Firefox) après basing off l'approche par cette réponse .

d'abord, démarrez un compte à rebours sur le serveur dans le gestionnaire d'événements beforeunload dans JS. Les appels ajax doivent être synchrones pour que IE et Edge fonctionnent correctement. Vous devez également utiliser return; pour empêcher la boîte de dialogue de confirmation d'afficher comme ceci:

    window.addEventListener("beforeunload", function (e) {        
      $.ajax({
          type: "POST",
          url: startTimerUrl,
          async: false           
      });
      return;
    });

démarrage de la minuterie place le drapeau cancelLogout à false . Si l'utilisateur rafraîchit la page ou navigue vers un autre lien interne, le drapeau cancelLogout sur le serveur est défini à true . Lorsque la minuterie s'arrête, il vérifie le drapeau cancelLogout pour voir si l'événement de déconnexion a été annulé. Si le minuteur a été annulé, alors il arrêterait le minuteur. Si le navigateur ou l'onglet était fermé, alors le drapeau cancelLogout resterait false et le gestionnaire d'événements se déconnecterait de l'utilisateur.

note de mise en oeuvre: j'utilise ASP.NET MVC 5 et j'annule la déconnexion dans une méthode dépassée Controller.OnActionExecuted() .

3
répondu Ionian316 2017-05-23 12:03:08

Pour des tâches similaires, vous pouvez utiliser sessionStorage pour stocker des données localement jusqu'à ce que l'onglet du navigateur est fermé.

l'objet sessionStorage stocke les données pour une seule session (les données sont supprimées lorsque l'onglet Navigateur est fermé).( W3Schools )

C'est mon stylo .

<div id="Notice">
    <span title="remove this until browser tab is closed"><u>dismiss</u>.</span>
</div>
<script>
    $("#Notice").click(function() {
     //set sessionStorage on click
        sessionStorage.setItem("dismissNotice", "Hello");
        $("#Notice").remove();
    });
    if (sessionStorage.getItem("dismissNotice"))
    //When sessionStorage is set Do stuff...
        $("#Notice").remove();
</script>
3
répondu csandreas1 2018-05-07 10:09:52
window.onbeforeunload = function() {
  console.log('event');
  return false; //here also can be string, that will be shown to the user
}
1
répondu IvanM 2013-12-28 05:55:22

essayez ceci, Je suis sûr que cela fonctionnera pour vous.

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type='text/javascript'>
    $(function() {

        try{
            opera.setOverrideHistoryNavigationMode('compatible');
            history.navigationMode = 'compatible';
        }catch(e){}

        function ReturnMessage()
        {
            return "wait";
        }

        function UnBindWindow()
        {
            $(window).unbind('beforeunload', ReturnMessage);
        }

        $(window).bind('beforeunload',ReturnMessage );
    });
</script>
0
répondu Tejash Raval Prajapati 2015-10-14 10:24:12
window.onbeforeunload = function ()
{       

    if (isProcess > 0) 
    {
        return true;       
    }   

    else
    { 
        //do something      
    }
}; 

cette fonction affiche une boîte de dialogue de confirmation si vous fermez la fenêtre ou rafraîchissez la page pendant un processus dans le navigateur.Cette fonction fonctionne dans tous les navigateurs.Vous devez définir isProcess var dans votre processus ajax.

0
répondu Hari 2016-01-08 08:46:19
window.addEventListener("beforeunload", function (e) {
 var confirmationMessage = "tab close";

 (e || window.event).returnValue = confirmationMessage;     //Gecko + IE
 sendkeylog(confirmationMessage);
 return confirmationMessage;                                //Webkit, Safari, Chrome etc.
}); 
0
répondu user3098847 2016-05-09 10:57:37

j'ai trouvé un moyen, que fonctionne sur tous mes navigateurs .

testé sur les versions suivantes: Firefox 57, Internet Explorer 11, Edge 41, l'un des Chrome latestés (il ne montrera pas ma version)

Note : onbeforeunload Fire si vous quittez la page de n'importe quelle façon possible (rafraîchir, fermer le navigateur, rediriger, lien, soumettre..). Si vous voulez seulement que cela se produise sur la fermeture du navigateur, liez simplement les gestionnaires d'événements.

  $(document).ready(function(){         

        var validNavigation = false;

        // Attach the event keypress to exclude the F5 refresh (includes normal refresh)
        $(document).bind('keypress', function(e) {
            if (e.keyCode == 116){
                validNavigation = true;
            }
        });

        // Attach the event click for all links in the page
        $("a").bind("click", function() {
            validNavigation = true;
        });

        // Attach the event submit for all forms in the page
        $("form").bind("submit", function() {
          validNavigation = true;
        });

        // Attach the event click for all inputs in the page
        $("input[type=submit]").bind("click", function() {
          validNavigation = true;
        }); 

        window.onbeforeunload = function() {                
            if (!validNavigation) {     
                // ------->  code comes here
            }
        };

  });
0
répondu Syno 2018-01-24 12:55:12

comme @jAndy l'a mentionné, il n'y a pas de code javascript adéquat pour détecter une fenêtre fermée. J'ai commencé par ce que @Syno avait proposé.

j'ai traversé une telle situation et si vous suivez ces étapes, vous pourrez La détecter.

Je l'ai testé sur Chrome 67+ et Firefox 61+.

var wrapper = function () { //ignore this

var closing_window = false;
$(window).on('focus', function () {
    closing_window = false; 
   //if the user interacts with the window, then the window is not being 
   //closed
});

$(window).on('blur', function () {

    closing_window = true;
    if (!document.hidden) { //when the window is being minimized
        closing_window = false;
    }
    $(window).on('resize', function (e) { //when the window is being maximized
        closing_window = false;
    });
    $(window).off('resize'); //avoid multiple listening
});

$('html').on('mouseleave', function () {
    closing_window = true; 
    //if the user is leaving html, we have more reasons to believe that he's 
    //leaving or thinking about closing the window
});

$('html').on('mouseenter', function () {
    closing_window = false; 
    //if the user's mouse its on the page, it means you don't need to logout 
    //them, didn't it?
});

$(document).on('keydown', function (e) {

    if (e.keyCode == 91 || e.keyCode == 18) {
        closing_window = false; //shortcuts for ALT+TAB and Window key
    }

    if (e.keyCode == 116 || (e.ctrlKey && e.keyCode == 82)) {
        closing_window = false; //shortcuts for F5 and CTRL+F5 and CTRL+R
    }
});

// Prevent logout when clicking in a hiperlink
$(document).on("click", "a", function () {
    closing_window = false;
});

// Prevent logout when clicking in a button (if these buttons rediret to some page)
$(document).on("click", "button", function () {
    closing_window = false;

});
// Prevent logout when submiting
$(document).on("submit", "form", function () {
    closing_window = false;
});
// Prevent logout when submiting
$(document).on("click", "input[type=submit]", function () {
    closing_window = false;
});

var toDoWhenClosing = function() {

    //write a code here likes a user logout, example: 
    //$.ajax({
    //    url: '/MyController/MyLogOutAction',
    //    async: false,
    //    data: {

    //    },
    //    error: function () {
    //    },
    //    success: function (data) {
    //    },
    //});
};


window.onbeforeunload = function () {
    if (closing_window) {
        toDoWhenClosing();
    }
};

};

0
répondu Bruno Henrique 2018-07-31 17:51:31

Il est possible de le vérifier avec l'aide de la fenêtre.fermé dans un gestionnaire d'événement sur "décharger" l'événement de ce genre, mais le délai d'utilisation est nécessaire (donc le résultat ne peut être garanti que si qch prévenir ou retarder l'apparition de la fenêtre de fermeture):

Exemple de JSFiddle (Testé sur lates Safari, FF, Chrome, Edge et IE11 )

var win = window.open('', '', 'width=200,height=50,left=200,top=50');
win.document.write(`<html>
   <head><title>CHILD WINDOW/TAB</title></head>
   <body><h2>CHILD WINDOW/TAB</h2></body>
</html>`);
win.addEventListener('load',() => {
    document.querySelector('.status').innerHTML += '<p>Child was loaded!</p>';
});
win.addEventListener('unload',() => {
    document.querySelector('.status').innerHTML += '<p>Child was unloaded!</p>';
    setTimeout(()=>{
        document.querySelector('.status').innerHTML +=  getChildWindowStatus();
    },1000);
});
win.document.close()
document.querySelector('.check-child-window').onclick = ()=> {
    alert(getChildWindowStatus());
}
function getChildWindowStatus() {
  if (win.closed) { 
      return 'Child window has been closed!';
  } else {
      return 'Child window has not been closed!';
  }
}
0
répondu Rvach.Flyver 2018-08-13 07:51:07

essayez ceci. Il va travailler. la méthode jquery unload est dépréciée.

window.onbeforeunload = function(event) {
    event.returnValue = "Write something clever here..";
};
-1
répondu Arda Ç. 2016-01-14 11:47:02
<script type="text/javascript" language="Javascript">

function DetectBrowserExit()
{
   alert('Execute task which do you want before exit');
}

window.onbeforeunload = function(){ DetectBrowserExit(); }

</script>

j'ai testé ce script dans les navigateurs Web suivants: Pour le moment, le navigateur web Opera ne supporte pas l'événement onBeforeUnload. Internet Explorer Mozilla Firefox Google Chrome Safari

-2
répondu Xman Classical 2015-10-12 02:42:56