Window.onforecharger une requête ajax dans Chrome

J'ai une page Web qui gère le contrôle à distance d'une machine via Ajax. Lorsque l'utilisateur navigue loin de la page, je souhaite me déconnecter automatiquement de la machine. Voici donc le code:

window.onbeforeunload = function () { bas_disconnect_only(); } 

La fonction de déconnexion envoie simplement une requête HTTP GET à un script côté serveur PHP, qui fait le travail réel de déconnexion:

 function bas_disconnect_only () { var xhr = bas_send_request("req=10", function () { }); } 

Cela fonctionne bien dans FireFox. Mais avec Chrome, la requête ajax n'est pas envoyée du tout. Il existe une solution de contournement inacceptable: ajout d'alerte à la fonction de rappel:

 function bas_disconnect_only () { var xhr = bas_send_request("req=10", function () { alert("You're been automatically disconnected."); }); } 

Après avoir ajouté l'appel d'alerte, la demande serait envoyée avec succès. Mais comme vous pouvez le voir, ce n'est vraiment pas un problème.

Quelqu'un pourrait-il me dire si cela est possible avec Chrome? Ce que je fais me paraît complètement légitime.

Merci,

J'avais le même problème, où Chrome n'émettait pas la requête AJAX au serveur dans l'événement window.unload.

Je ne pouvais le faire fonctionner que si la demande était synchrone. J'ai pu le faire avec Jquery et définir la propriété asynchmène sur false :

 $(window).unload(function () { $.ajax({ type: 'GET', async: false, url: 'SomeUrl.com?id=123' }); }); 

Le code ci-dessus fonctionne pour moi dans IE9, Chrome 19.0.1084.52 m et Firefox 12.

Je sais que cette question a été posée il y a quelque temps, et ce que je vais dire est pertinent pour les versions plus récentes de Chrome, mais je pense que cela pourrait être utile pour de nombreux développeurs.

Comme l'a déclaré @Garry English, l'envoi d'une requête asynchique pendant la surcharge de la page ne fonctionnera pas, car le navigateur va tuer le fil avant d'envoyer la demande. L'envoi d'une requête de synchronisation devrait cependant fonctionner.

C'était juste jusqu'à la version 29 de Chrome, mais sur Chrome V 30, il a cessé de fonctionner comme indiqué ici .

Il semble que la seule façon de faire cela aujourd'hui est d'utiliser l'événement onbreforeload comme suggéré ici .

MAIS NOTE: les autres navigateurs ne vous permettront pas d'envoyer des requêtes Ajax dans l'événement onbeforeunload. Alors, ce que vous devrez faire, c'est d'exécuter l'action en décharge et en avant charge, et vérifier si elle avait déjà eu lieu.

Quelque chose comme ça:

 var _wasPageCleanedUp = false; function pageCleanup() { if (!_wasPageCleanedUp) { $.ajax({ type: 'GET', async: false, url: 'SomeUrl.com/PageCleanup?id=123', success: function () { _wasPageCleanedUp = true; } }); } } $(window).on('beforeunload', function () { //this will work only for Chrome pageCleanup(); }); $(window).on("unload", function () { //this will work for other browsers pageCleanup(); }); 

J'espère que cela aide quelqu'un.

Cochez la méthode Navigator.sendBeacon () qui a été créée à cet effet.

La page MDN dit:

La méthode navigator.sendBeacon () peut être utilisée pour transférer de manière asynchrone de petites données HTTP de l'agent utilisateur vers un serveur Web.

Cette méthode répond aux besoins de l'analyse et au code de diagnostic qui tentent généralement d'envoyer des données vers un serveur Web avant le déchargement du document. L'envoi des données plus tôt pourrait entraîner une occasion manquée de recueillir des données. Cependant, s'assurer que les données ont été envoyées pendant le déchargement d'un document est quelque chose qui a été traditionnellement difficile pour les développeurs.

Il s'agit d'une API relativement plus récente et ne semble pas encore être prise en charge par IE.

Essayez de créer une variable (Boolean de préférence) et de la faire changer une fois que vous recevez une réponse de l'appel Ajax. Et mettez la fonction bas_disconnect_only() dans une boucle while. J'ai également eu un problème comme celui-ci une fois. Je pense que cela se produit car Chrome n'attend pas l'appel d'Ajax. Je ne sais pas comment je l'ai réparé et je n'ai pas essayé ce code, donc je ne sais pas si cela fonctionne. Voici un exemple de ceci:

 var has_disconnected = false; window.onbeforeunload = function () { while (!has_disconnected) { bas_disconnect_only(); // This doesn't have to be here but it doesn't hurt to add it: return true; } } 

Et à l'intérieur de la fonction bas_send_request() ( xmlhttp est la requête HTTP):

 xmlhttp.onreadystatechange = function() { if (xmlhttp.readyState == 4 && xmlhttp.status == 200) has_disconnected = true; } 

Bonne chance et j'espère que cela vous aidera.