161 votes

Comment capturer l'événement de fermeture de la fenêtre du navigateur ?

Je veux capturer l'événement de fermeture de la fenêtre/de l'onglet du navigateur. J'ai essayé ce qui suit avec jQuery :

jQuery(window).bind(
    "beforeunload", 
    function() { 
        return confirm("Do you really want to close?") 
    }
)

Mais cela fonctionne aussi sur la soumission du formulaire, ce qui n'est pas ce que je veux. Je veux un événement qui se déclenche uniquement lorsque l'utilisateur ferme la fenêtre.

226voto

SLaks Points 391154

El beforeunload se déclenche lorsque l'utilisateur quitte votre page pour une raison quelconque.

Par exemple, elle sera déclenchée si l'utilisateur soumet un formulaire, clique sur un lien, ferme la fenêtre (ou l'onglet) ou se rend sur une nouvelle page en utilisant la barre d'adresse, le champ de recherche ou un signet.

Vous pourriez exclure les soumissions de formulaires et les hyperliens (sauf ceux provenant d'autres cadres) avec le code suivant :

var inFormOrLink;
$('a').on('click', function() { inFormOrLink = true; });
$('form').on('submit', function() { inFormOrLink = true; });

$(window).on("beforeunload", function() { 
    return inFormOrLink ? "Do you really want to close?" : null; 
})

Pour les versions de jQuery antérieures à 1.7, essayez ceci :

var inFormOrLink;
$('a').live('click', function() { inFormOrLink = true; });
$('form').bind('submit', function() { inFormOrLink = true; });

$(window).bind("beforeunload", function() { 
    return inFormOrLink ? "Do you really want to close?" : null; 
})

El live ne fonctionne pas avec la méthode submit Ainsi, si vous ajoutez un nouveau formulaire, vous devrez également lier le gestionnaire à celui-ci.

Notez que si un autre gestionnaire d'événements annule l'envoi ou la navigation, vous perdrez l'invite de confirmation si la fenêtre est effectivement fermée ultérieurement. Vous pouvez remédier à cela en enregistrant l'heure dans le champ submit y click et de vérifier si le beforeunload se produit plus de deux secondes plus tard.

8 votes

Oui, ça marche très bien ! Les versions plus récentes de jquery supportent $('form').live('submit, function() { }).

6 votes

Votre solution est bonne mais comment annuler l'événement en cas de rafraîchissement ? Je veux que l'événement ne se produise que si le navigateur est fermé, pas en cas de rafraîchissement.

0 votes

Il semble que le navigateur affiche la valeur de retour de beforeunload comme un dialogue de confirmation. Je pense donc que cette réponse est plus précise : lien

46voto

karim79 Points 178055

Peut-être qu'il suffit de délier le beforeunload dans le gestionnaire d'événement du formulaire submit gestionnaire d'événements :

jQuery('form').submit(function() {
    jQuery(window).unbind("beforeunload");
    ...
});

3 votes

N'est-ce pas aussi facile de ne pas utiliser jQuery en spécifiant ceci dans la définition de la balise de formulaire : `<form onsubmit="window.onbeforeunload=null ;">.

4 votes

@awe Mais il faut l'inclure. onsubmit=... dans chaque formulaire. (J'ai plusieurs formulaires par page, dans une certaine webapp).

17voto

desm Points 141

Pour une solution multi-navigateurs (testée dans Chrome 21, IE9, FF15), vous pouvez utiliser le code suivant, qui est une version légèrement modifiée du code de Slaks :

var inFormOrLink;
$('a').live('click', function() { inFormOrLink = true; });
$('form').bind('submit', function() { inFormOrLink = true; });

$(window).bind('beforeunload', function(eventObject) {
    var returnValue = undefined;
    if (! inFormOrLink) {
        returnValue = "Do you really want to close?";
    }
    eventObject.returnValue = returnValue;
    return returnValue;
}); 

Notez que depuis Firefox 4, le message "Do you really want to close ?" n'est pas affiché. FF affiche simplement un message générique. Voir la note dans https://developer.mozilla.org/en-US/docs/DOM/window.onbeforeunload

3 votes

Celui-ci fonctionne de manière cohérente sur tous les navigateurs. Juste une note rapide ; j'ai mis à jour les deux live y el bind les déclarations à on qui fonctionne parfaitement avec la dernière version de jQuery. Merci !

17voto

window.onbeforeunload = function () {
    return "Do you really want to close?";
};

3voto

kapad Points 262

J'ai utilisé la réponse de Slaks mais cela ne fonctionnait pas tel quel, puisque la returnValue onbeforeunload est analysée comme une chaîne de caractères et ensuite affichée dans la boîte de confirmation du navigateur. Ainsi, la valeur true était affichée, comme "true".

L'utilisation de return a fonctionné. Voici mon code

var preventUnloadPrompt;
var messageBeforeUnload = "my message here - Are you sure you want to leave this page?";
//var redirectAfterPrompt = "http://www.google.co.in";
$('a').live('click', function() { preventUnloadPrompt = true; });
$('form').live('submit', function() { preventUnloadPrompt = true; });
$(window).bind("beforeunload", function(e) { 
    var rval;
    if(preventUnloadPrompt) {
        return;
    } else {
        //location.replace(redirectAfterPrompt);
        return messageBeforeUnload;
    }
    return rval;
})

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