2010-02-21 7 views
4

Mon Javascript doit envoyer des données à un serveur lorsque la page se ferme, ce que je fais actuellement avec une requête AJAX synchrone (SJAX?) En window.onbeforeunload. Le problème avec ceci, bien sûr, est que si mon serveur prend trop de temps ou que la connexion réseau meurt, le navigateur se fige. D'après ce que j'ai lu, il n'est pas possible de spécifier un délai d'expiration pour les requêtes AJAX synchrones, et les requêtes AJAX asynchrones ne fonctionnent pas sur window.onbeforeunload. Ma meilleure estimation à la façon de résoudre ce serait d'utiliser une requête asynchrone, puis verrouiller le navigateur pendant un certain temps pour laisser la finition de la demande:Javascript timeout AJAX synchrone

window.onbeforeunload = function() { 
    doSomeAjax(); // asynchronous request 

    var now = new Date(); 
    var time_limit = now.getTime()+2000; // 2,000 ms 
    while(now.getTime() < time_limit) { 
    now = new Date(); 
    } 
} 

Est-ce que ce travail? Y a-t-il des problèmes potentiels avec cette méthode?

+0

Personnellement, je pense que toute cette approche pourrait devoir changer. Les événements de fermeture de fenêtres sont difficiles et ce qui fonctionne sur un navigateur est sûr d'en interrompre un autre. Pourriez-vous nous en dire un peu plus sur votre objectif? Alors quelqu'un pourrait être en mesure de proposer une approche différente. – e4c5

Répondre

0

Votre problème est que le navigateur se fige, et vous essayez de le résoudre en gelant manuellement le navigateur en boucle. Cela gèlera également le thread de l'interface utilisateur, ce qui n'est pas un problème potentiel, c'est un problème certain.

Étant donné que le navigateur est en cours de fermeture, vous n'avez pas besoin de recevoir de commentaires des réponses AJAX pour mettre à jour la page en cours de fermeture. Dans ce cas, vous pourriez peut-être résoudre vos problèmes en injectant des balises IMG dans, par exemple, un DIV caché, avec leurs propriétés src définies sur l'URL que vous souhaitez demander.

+0

Le navigateur va-t-il toujours récupérer l'image si elle se trouve dans une div masquée et que la fenêtre/l'onglet se ferme? – igul222

+0

J'imagine que ça pourrait. mais il faudrait que vous fassiez vos propres expérimentations pour en être certain, je n'ai jamais eu la raison d'essayer par moi-même. –

Questions connexes