N'a pas le temps d'envoyer une demande sur la fenêtre de déchargement

Je souhaite informer le serveur sur l'utilisateur ferme la fenêtre du navigateur.

J'ai essayé tous les

$(window).bind("beforeunload", function() { $.get("${contextPath}/notify?direction=logout"); }); 

et

 $(window).unload( function() { $.get("${contextPath}/notify?direction=logout"); }); 

et

 $(window).unload(function() { $.ajax({ url: "${contextPath}/notify?direction=logout" }); }); 

Mais cela ne marche pas bien, malgré le fait qu'il est dit dans le manuel qu'il devrait probablement.

Dans Firefox, je n'ai pas de notifications uniquement lors de la fermeture de la fenêtre, mais j'ai des mises à jour sur la page. Dans Chrome, je n'en ai pas non plus.

J'ai essayé de suivre ce script dans Firebug ou Chrome Developer Tools et j'ai découvert qu'il commence à fonctionner s'il est tracé! Je pense donc que cela ne fonctionne pas normalement parce qu'il n'a pas le temps d'envoyer une demande avant la fermeture ou la navigation de la fenêtre.

Est-ce vrai? Comment accomplir ma tâche?

SOLUTION

Cela a fonctionné:

 $(window).bind("beforeunload", function() { $.ajax({ async: false, url: 'notify' }); } ); 

C'est très délicat car le navigateur n'attend que la réponse, alors la requête ajax peut être interrompue.

Vous pouvez essayer quelque chose comme ceci dans l'événement beforeunload.

 $(window).bind("beforeunload", function() { $.ajax({ async: false,//This will make sure the browser waits until request completes url: "${contextPath}/notify?direction=logout" }); }); 

Même si cela était possible, je ne le recommanderais toujours pas. Dans le cas où vous parvenez à ce travail, il ne fonctionnera pas dans tous les navigateurs et je le conseillerai toujours.

Si vous êtes désespéré de savoir quand un utilisateur quitte votre domaine, utilisez des sondages ou des websockets avec un repli.

Vous pouvez également donner aux cookies un délai d'attente court et utiliser des intervalles pour les mettre à jour périodiquement sur le site, des trucs comme ceux-là pourraient même fonctionner.

En outre, il "commence" en cours de traitement, car l'événement est déclenché avant que la page suivante ne commence même le chargement. Il a été un moment, mais la dernière fois que j'ai joué avec ces événements, mais certains navigateurs peuvent exécuter du code pendant une période pendant que la page suivante se charge.

Vous avez de la chance, il serait impossible pour un utilisateur de quitter une page si le JavaScript exécuté sur la page a été bloqué.

Imaginez tout le spam.

Sur certains navigateurs, l'événement de déchargement déclenchera, mais une condition de course se produira entre votre script et le nettoyage de la page.

Merci

Je ne veux pas dire cela en tant que commentaire parce que je travaillais sur ce scénario depuis longtemps. Je sauvegarderais toutes les informations sur le serveur lorsqu'un utilisateur final clôture accidentellement ou intentionnellement le navigateur. Je vous dirais … C'était génial.

J'ai dit travailler très bien? Eh bien, ce n'était qu'avec Firefox et IE. Il a échoué dans de nombreux autres navigateurs (comme Opera, Safari).

Donc, mon conseil génial n'est pas de dépendre de ces fonctions, car elles ne sont que spécifiques au navigateur.