6
votes

N'ayez pas le temps d'envoyer une demande d'accès à la fenêtre Décharger

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

J'ai essayé tous les p> xxx pré>

et p> xxx pré >

et p> xxx pré>

mais qui ne fonctionne pas bien, malgré le fait que cela se disait dans le manuel qu'il faut probablement. P>

dans Firefox I N'A PAS DE NOTIFICATIONS SEULEMENT SUR LA FENÊTRE FERMER, mais faites-en une page d'actualisation de la page. En Chrome, je n'ai ni. P>

J'ai essayé de tracer ce script dans des outils de développeurs Firebug ou de chrome et trouvé, qu'il commence à travailler si elle est tracée! Donc, je pense que cela ne fonctionne pas normalement parce qu'il n'a pas le temps d'envoyer la demande avant la fermeture de la fenêtre fermée ou de naviguer. P>

est-ce vrai? Comment accomplir ma tâche? P>

Solution forte> p>

Ceci a fonctionné: P>

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


2 commentaires

Première pensée: Ajax est le mauvais outil pour le travail. Vous devriez utiliser AJAX (synchrones), Ajax par définition libère le thread de l'interface graphique pour poursuivre le traitement [dans ce cas de déchargement].


Consultez cette réponse: Stackoverflow.com/a/9234785/252780


5 Réponses :


0
votes

Vous n'avez pas de chance, il serait impossible pour un utilisateur de quitter une page si le JavaScript exécuté à la page Le déchargement de la page bloquait.

Imaginez tout le spam.

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

merci


0 commentaires

5
votes

Il est très délicat car le navigateur n'attendra pas que la réponse ne vienne donc que la demande Ajax pourrait être abandonnée.

Vous pouvez essayer quelque chose comme celui-ci dans un événement à propos à propos. xxx


1 commentaires

C'est peu fiable et pendant que vous pouvez "essayer" et cela peut fonctionner, il ne devrait jamais être utilisé dans un environnement de production.



0
votes

Je ne veux pas dire cela comme un commentaire parce que je travaillais sur ce scénario de temps de temps. Je sauvegarderais toutes les informations sur le serveur lorsqu'un utilisateur final ferme accidentellement ou intentionnellement le navigateur. je vous dirait .. Ça travaillait bien.,

J'ai dit travailler très bien? Eh bien c'était seulement avec Firefox et c'est-à-dire. Ce échoué dans de nombreux autres navigateurs (comme Opera, Safari).

Donc, mon aimable conseil n'est pas de dépendre de ces fonctions, comme ils sont Seulement spécifique au navigateur.


0 commentaires

1
votes

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

Si vous êtes désespéré de savoir quand un utilisateur quitte votre domaine, utilisez le sondage ou les swickets avec une secousse.

Vous pouvez également donner aux cookies un délai bref et utiliser des intervalles pour les mettre à jour périodiquement tandis que sur le site, des astuces comme cela fonctionneraient même.

En outre, il "commence" fonctionne en fonction de la trace, car l'événement est tiré avant la prochaine page ne commence que le chargement. Cela fait 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 de temps pendant la charge de la page suivante.


1 commentaires

La fiabilité pas 100% est correcte pour ma tâche, car j'ai des solutions de sauvegarde comme vous l'avez dit. Le problème avec le sondage périodique est que cela ne fonctionne pas vite. J'ai donc besoin d'une solution rapide qui fonctionne avec certains des navigateurs.



22
votes

Les autres réponses sont obsolètes et causent d'autres problèmes, tels que la signalisation non fiable ou retarder la charge de la page suivante.

La meilleure solution consiste à utiliser navigator.sendBeacon code>: https://developer.mozilla.org/en-us/ddocs / Web / API / NAVIGATOR / SENDBEAACON P>

window.addEventListener("unload", logData, false);

function logData() {
  navigator.sendBeacon("/log", analyticsData);
}


6 commentaires

C'est exactement la solution que j'ai recherchée depuis des âges. +1, et j'avais à nouveau upvote si je pouvais!


Enfin trouvé une solution après avoir cherché plusieurs jours. C'est très utile @mofojed. Merci beaucoup.


J'aime sendbeacon . Le seul gotcha à noter est qu'utilise post et ne peut pas être changé.


SendBeacon est maintenant appelé asynchrone. Donc, la performance de l'onglet suivante n'est pas affectée. Vous voudrez peut-être éditer la réponse


@PHPKODE Il était déjà asynchrone, l'extrait de citation du bloc était de la page MDN expliquant d'autres méthodes qui étaient erronées / synchrones. Ils ont mis à jour la langue sur la page MDN, cependant, j'ai donc mis à jour cette réponse pour inclure cela.


Bonjour cette solution travaillant ou non