L' beforeunload
événement se déclenche chaque fois que l'utilisateur quitte votre page pour une raison quelconque.
Par exemple, il sera déclenché si l'utilisateur soumet un formulaire, clique sur un lien, ferme la fenêtre (ou l'onglet) ou accède à une nouvelle page à l'aide de la barre d'adresse, de la zone de recherche ou d'un signet.
Vous pouvez exclure les soumissions de formulaire et les liens hypertexte (à l'exception 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;
})
La live
méthode ne fonctionne pas avec l' submit
événement, donc si vous ajoutez un nouveau formulaire, vous devrez également lier le gestionnaire à celui-ci.
Notez que si un autre gestionnaire d'événements annule la soumission ou la navigation, vous perdrez l'invite de confirmation si la fenêtre est effectivement fermée plus tard. Vous pouvez résoudre ce problème en enregistrant le temps dans les submit
et click
événements, et vérifier si le beforeunload
produit plus que quelques secondes plus tard.
Ctrl + r
,F5
,Ctrl + Shift + r
et changer l'URL du navigateur?.on()
.Peut-être simplement dissocier le
beforeunload
gestionnaire d'événements dans le gestionnaire d'événements du formulairesubmit
:la source
onsubmit=...
dans chaque formulaire. (J'ai plusieurs formulaires par page, dans une certaine application Web)Pour une solution multi-navigateurs (testée dans Chrome 21, IE9, FF15), pensez à utiliser le code suivant, qui est une version légèrement modifiée du code de Slaks:
Notez que depuis Firefox 4, le message "Voulez-vous vraiment fermer?" n'est pas affiché. FF affiche juste un message générique. Voir la note dans https://developer.mozilla.org/en-US/docs/DOM/window.onbeforeunload
la source
live
et lesbind
instructions toon
, ce qui fonctionne très bien avec le dernier niveau de jQuery. Merci!la source
Pour une solution qui fonctionne bien avec des contrôles tiers comme Telerik (ex: RadComboBox) et DevExpress qui utilisent les balises Anchor pour diverses raisons, envisagez d'utiliser le code suivant, qui est une version légèrement modifiée du code de desm avec un meilleur sélecteur pour soi ciblage des balises d'ancrage:
la source
Ma réponse vise à fournir des repères simples.
COMMENT
Voir la réponse @SLaks .
Combien de temps faut-il au navigateur pour finalement fermer votre page?
Chaque fois qu'un utilisateur ferme la page ( xbouton ou CTRL+ W), le navigateur exécute le
beforeunload
code donné , mais pas indéfiniment. La seule exception est la boîte de confirmation (return 'Do you really want to close?
) qui attendra la réponse de l'utilisateur.Chrome : 2 secondes.
Firefox : ∞ (ou double-cliquez, ou forcez la fermeture)
Edge : ∞ (ou double-cliquez)
Explorer 11 : 0 secondes.
Safari : TODO
Ce que nous avons utilisé pour tester ceci:
Ce qu'il fait, c'est envoyer autant de demandes que possible avant que le navigateur ne ferme sa page (de manière synchrone).
Sortie Chrome:
la source
J'ai utilisé la réponse de Slaks mais cela ne fonctionnait pas tel quel, car le returnValue onbeforeunload est analysé sous forme de chaîne puis affiché dans la boîte de confirmation du navigateur. Ainsi, la valeur true était affichée, comme "true".
Le simple fait d'utiliser le retour a fonctionné. Voici mon code
la source
Vous pourriez peut-être gérer OnSubmit et définir un indicateur que vous archiverez plus tard dans votre gestionnaire OnBeforeUnload.
la source
la source
Malheureusement, qu'il s'agisse d'un rechargement, d'une nouvelle redirection de page ou de la fermeture du navigateur, l'événement sera déclenché. Une alternative est d'attraper l'id déclenchant l'événement et s'il s'agit d'un formulaire, ne déclenchez aucune fonction et si ce n'est pas l'id du formulaire, faites ce que vous voulez faire lorsque la page se ferme. Je ne sais pas si cela est également possible directement et fastidieux.
Vous pouvez faire quelques petites choses avant que le client ne ferme l'onglet. javascript détecte le navigateur fermer l'onglet / fermer le navigateur mais si votre liste d'actions est grande et que l'onglet se ferme avant qu'il ne soit terminé, vous êtes impuissant. Vous pouvez l'essayer, mais avec mon expérience, n'en dépendez pas.
https://developer.mozilla.org/en-US/docs/Web/Reference/Events/beforeunload?redirectlocale=en-US&redirectslug=DOM/Mozilla_event_reference/beforeunload
la source
Si votre soumission de formulaire les amène à une autre page (comme je suppose que c'est le cas, d'où le déclenchement de
beforeunload
), vous pouvez essayer de changer la soumission de votre formulaire en un appel ajax. De cette façon, ils ne quitteront pas votre page lorsqu'ils soumettront le formulaire et vous pourrez utiliser votrebeforeunload
code de liaison comme vous le souhaitez.la source
Mon problème: l'événement «onbeforeunload» ne serait déclenché que s'il y avait un nombre impair de soumissions (clics). J'avais une combinaison de solutions issues de threads similaires dans SO pour que ma solution fonctionne. bien mon code parlera.
la source
Depuis jQuery 1.7, la méthode .live () est obsolète. Utilisez .on () pour attacher des gestionnaires d'événements. Les utilisateurs d'anciennes versions de jQuery devraient utiliser .delegate () de préférence à .live ()
sur complet ou lien
la source
Essayez ceci aussi
la source
Vérifiez simplement ...
la source
la source
La suite a fonctionné pour moi;
la source
event.clientY
est négatif si vous cliquez sur le bouton de fermeture du navigateur ou sur le bouton de fermeture de l'onglet. Cependant, cette valeur est positive lorsque vous rechargez la page à l'aide des raccourcis clavier (F5, Ctrl-R) ou fermez le navigateur à l'aide des raccourcis clavier (par exemple Alt-F4). Ainsi, vous ne pouvez pas vous fier à la position de l'événement pour différencier l'événement de fermeture du navigateur de l'événement de rechargement de page.