Existe-t-il un code JavaScript / jQuery inter-navigateurs pour détecter si le navigateur ou un onglet de navigateur est fermé, mais pas en raison d'un clic sur un lien?
javascript
jquery
cometta
la source
la source
sessionStorage
propriété, elle expirera à la fermeture du navigateur. w3schools.com/jsref/prop_win_sessionstorage.aspRéponses:
Si je vous comprends bien, vous voulez savoir quand un onglet / fenêtre est effectivement fermé. Eh bien, AFAIK est le seul moyen
Javascript
de détecter ce genre de chosesonunload
et lesonbeforeunload
événements.Malheureusement (ou heureusement?), Ces événements sont également déclenchés lorsque vous quittez un site via un
link
ou un bouton de retour de votre navigateur. C'est donc la meilleure réponse que je puisse donner, je ne pense pas que vous puissiez détecter nativement un purclose
en Javascript. Corrigez-moi si je me trompe ici.la source
String
valeur de retour personnalisée deonbeforeunload
. Vous ne pouvez donc plus afficher de message personnalisé avant le déchargement.unload
?Depuis la documentation de Firefox
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.
Cet exemple pour gérer tous les navigateurs.
la source
Solution simple
la source
// Cela fonctionne dans IE7, si vous fermez un onglet ou un navigateur avec un seul onglet
la source
window.onunload = "alert('wait')"
etwindow.onbeforeunload = "alert('wait... chrome!')"
utilisé la console dans Chromium / Ubuntu mais aucun n'a tiré lorsque j'ai fermé l'onglet.window.onunload = "alert('wait')"
et pareil ne devrait pas vraiment fonctionner. "La fonction doit affecter une valeur de chaîne à la propriété returnValue de l'objet Event et renvoyer la même chaîne". Veuillez lire l' article de MDNJ'avais besoin de déconnecter automatiquement l'utilisateur lorsque le navigateur ou l'onglet se ferme, mais pas lorsque l'utilisateur navigue vers d'autres liens. Je ne voulais pas non plus qu'une invite de confirmation s'affiche 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 (vérifié travailler avec IE 11, Edge, Chrome et Firefox) après avoir basé l'approche sur cette réponse .
Tout d'abord, démarrez un compte à rebours sur le serveur dans le
beforeunload
gestionnaire d'événements de JS. Les appels ajax doivent être synchrones pour qu'IE et Edge fonctionnent correctement. Vous devez également utiliserreturn;
pour empêcher la boîte de dialogue de confirmation de s'afficher comme suit:Le démarrage de la minuterie définit le
cancelLogout
drapeau sur faux . Si l'utilisateur actualise la page ou navigue vers un autre lien interne, l'cancelLogout
indicateur sur le serveur est défini sur true . Une fois l'événement de temporisation écoulé, il vérifie l'cancelLogout
indicateur pour voir si l'événement de déconnexion a été annulé. Si la minuterie a été annulée, cela arrêterait la minuterie. Si le navigateur ou l'onglet était fermé, l'cancelLogout
indicateur resterait faux et le gestionnaire d'événements déconnecterait l'utilisateur.Remarque sur la mise en œuvre: j'utilise ASP.NET MVC 5 et j'annule la déconnexion dans une
Controller.OnActionExecuted()
méthode remplacée .la source
OnActionExecuted
?Désolé, je n'ai pas pu ajouter de commentaire à l'une des réponses existantes, mais au cas où vous souhaiteriez implémenter une sorte de boîte de dialogue d'avertissement, je voulais simplement mentionner que toute fonction de gestionnaire d'événements a un argument - événement. Dans votre cas, vous pouvez appeler event.preventDefault () pour interdire de quitter la page automatiquement, puis lancer votre propre boîte de dialogue. Je considère que c'est une meilleure option que d'utiliser l'alerte standard laide et non sécurisée (). J'ai personnellement implémenté mon propre ensemble de boîtes de dialogue basées sur l'objet kendoWindow (l'interface utilisateur Kendo de Telerik, qui est presque entièrement open source, à l'exception de kendoGrid et kendoEditor). Vous pouvez également utiliser des boîtes de dialogue à partir de l'interface utilisateur jQuery. Veuillez noter cependant que ces choses sont asynchrones et que vous devrez lier un gestionnaire à l'événement onclick de chaque bouton, mais tout cela est assez facile à implémenter.
Cependant, je conviens que l'absence de l'événement de fermeture réel est terrible: si vous, par exemple, souhaitez réinitialiser votre état de session en arrière-plan uniquement en cas de fermeture réelle, c'est un problème.
la source
Pour des tâches similaires, vous pouvez utiliser
sessionStorage
pour stocker des données localement jusqu'à la fermeture de l'onglet du navigateur.L'
sessionStorage
objet stocke les données pour une seule session (les données sont supprimées lorsque l'onglet du navigateur est fermé). ( W3Schools )Ceci est ma plume .
la source
Il n'y a aucun événement, mais il existe une propriété
window.closed
qui est prise en charge dans tous les principaux navigateurs au moment de la rédaction de cet article. Ainsi, si vous aviez vraiment besoin de savoir, vous pourriez interroger la fenêtre pour vérifier cette propriété.if(myWindow.closed){do things}
Remarque: Interroger quoi que ce soit n'est généralement pas la meilleure solution. L'
window.onbeforeunload
événement doit être utilisé si possible, la seule mise en garde étant qu'il se déclenche également si vous vous éloignez.la source
la source
beforeunload
si vous souhaitez afficher une alerte. Comme ça:$(window).on('beforeunload', function(){ alert ('Bye now')});
Essayez de l'utiliser:
la source
J'ai trouvé un moyen qui fonctionne sur tous mes navigateurs .
Testé sur les versions suivantes: Firefox 57, Internet Explorer 11, Edge 41, l'un des derniers Chrome (il ne montrera pas ma version)
la source
Étant donné que personne ne l'a encore mentionné (8 ans et plus plus tard): Un WebSocket peut être un autre moyen efficace de détecter un onglet fermé. Tant que l'onglet est ouvert et pointé vers l'hôte, le client est en mesure de maintenir une connexion WebSocket active à l'hôte.
Mise en garde: veuillez noter que cette solution n'est vraiment viable pour un projet que si un WebSocket ne nécessite aucun frais supplémentaire significatif par rapport à ce que vous faites déjà.
Dans un délai raisonnable (par exemple 2 minutes), le côté serveur peut déterminer que le client a disparu après la déconnexion du WebSocket et effectuer toute action souhaitée, comme la suppression des fichiers temporaires téléchargés. (Dans mon cas d'utilisation extrêmement spécialisé, mon objectif était de mettre fin à un serveur d'application localhost trois secondes après la fin de la connexion WebSocket et de la fin de toutes les activités CGI / FastCGI - aucune autre connexion persistante ne m'affecte.)
J'ai rencontré des problèmes pour que le gestionnaire d'événements onunload fonctionne correctement avec les balises (comme recommandé par cette réponse ). La fermeture de l'onglet n'a pas semblé déclencher la balise et les onglets ouverts l'ont déclenchée d'une manière qui pourrait potentiellement causer des problèmes. Un WebSocket a résolu le problème que je rencontrais plus proprement car la connexion se ferme à peu près au même moment que l'onglet se ferme et le changement de page dans l'application ouvre simplement une nouvelle connexion WebSocket bien dans la fenêtre de délai.
la source
Lien JSFiddle
Salut à tous, J'ai pu obtenir des clics «Détecter le navigateur et fermer l'événement» en utilisant le stockage local et l'horodatage du navigateur. J'espère que vous pourrez tous résoudre vos problèmes en utilisant cette solution.
Après mes recherches initiales, j'ai découvert que lorsque nous fermons un navigateur, le navigateur fermera tous les onglets un par un pour fermer complètement le navigateur. Par conséquent, j'ai observé qu'il y aura très peu de délai entre la fermeture des onglets. J'ai donc pris ce délai comme principal point de validation et capable de détecter les événements de fermeture du navigateur et de l'onglet.
Je l'ai testé sur la version 76.0.3809.132 du navigateur Chrome et j'ai trouvé qu'il fonctionnait
:) Votez si vous avez trouvé ma réponse utile ....
la source
la source
here also can be string, that will be shown to the user
ce n'est pas le cas, sur firefox, il le fait en chrome cependant ...Il est possible de le vérifier à l'aide de window.closed dans un gestionnaire d'événements sur un événement de déchargement comme celui-ci, mais l'utilisation du délai d'attente est requise (le résultat ne peut donc pas être garanti si smth retarde ou empêche la fermeture de la fenêtre):
Exemple de JSFiddle (testé sur lates Safari, FF, Chrome, Edge et IE11)
la source
J'ai essayé toutes les solutions ci-dessus, aucune d'entre elles n'a vraiment fonctionné pour moi, spécialement parce qu'il y a des composants Telerik dans mon projet qui ont un bouton 'Fermer' pour les fenêtres popup, et il appelle l'événement 'beforeunload'. De plus, le sélecteur de boutons ne fonctionne pas correctement lorsque vous avez une grille Telerik dans votre page (je veux dire des boutons à l'intérieur de la grille). Je ne peux donc pas utiliser l'une des suggestions ci-dessus. Enfin, c'est la solution qui a fonctionné pour moi. J'ai ajouté un événement onUnload sur la balise body de _Layout.cshtml. Quelque chose comme ça:
puis ajoutez la fonction LogOff pour rediriger vers Account / LogOff qui est une méthode intégrée dans Asp.Net MVC. Maintenant, lorsque je ferme le navigateur ou l'onglet, il redirige vers la méthode LogOff et l'utilisateur doit se connecter lors de son retour. Je l'ai testé dans Chrome et Firefox. Et il fonctionne!
la source
Cette fonction affiche une boîte de dialogue de confirmation si vous fermez la fenêtre ou actualisez 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.
la source
la source
sendkeylog
?Comme @jAndy l'a mentionné, il n'y a pas de code javascript correctement pour détecter la fermeture d'une fenêtre. Je suis parti de ce que @Syno avait proposé.
Je suis passé par une situation comme celle-ci et à condition de suivre ces étapes, vous pourrez le détecter.
Je l'ai testé sur Chrome 67+ et Firefox 61+.
};
la source
resize
lorsque la fenêtre est floue. S'il devient flou 100x, vous aurez 100 auditeurs, ce qui ralentira le navigateur.essayez ceci, je suis sûr que cela fonctionnera pour vous.
la source
Essaye ça. Ça va marcher. La méthode de déchargement jquery est obsolète.
la source