2010-09-06 10 views
4

Je dois admettre que c'est mon premier article sur ce site, donc je m'excuse si je fais quelque chose de mal (formatage etc).Jquery Ajax appels crash Internet Explorer?

De toute façon, je crée une sorte de mmo en utilisant javascript (et jQuery), et jusqu'à présent tout fonctionne bien dans Chrome, Safari, Firefox, etc. Cependant, j'ai trouvé que quelque part le long de la ligne, Internet Explorateur se bloque.

En reproduisant l'accident, je l'ai réduit à ce code:

function getUpdates(){ 
var data={uid:playerName,area:1,mid:lastMessage}; 
$.ajax({ 
    url: "getUpdates.py", 
    timeout: 32000, 
    data: data, 
    type:"GET", 
    complete: function(obj, textStatus){ 
      //handleUpdates(obj); 
     getUpdates(); 
     } 
    }); 
} 

qui est censé interroger des mises à jour sur une longue période. Cependant, dans IE après une réponse, ce code est bloqué dans une boucle infinie, ce qui va planter le navigateur. Il ne semble pas se bloquer après chaque réponse, seulement s'il n'y a pas de réponse du serveur.

Notez la ligne qui dit « complet: ... » a été jugé comme:

success: function(...){getUpdates();...}, 
error: function(...){getUpdates();...} 

avec le même problème se produit.

+1

On dirait que vous avez tout fait droit .. . toutes nos félicitations! Cependant, vous devriez probablement ajouter des balises 'javascript' et/ou' ajax' au lieu de 'long-polling'. – SLaks

+0

Pourquoi ne pas mettre un délai avant d'appeler à nouveau getUpdates(). –

+0

le serveur prend beaucoup de temps pour répondre aux requêtes (c'est pourquoi il y a une limite de 32 secondes) certaines requêtes peuvent prendre jusqu'à 30 secondes avant qu'une réponse ne soit générée. Le jeu est en temps réel, donc l'ajout d'un délai côté client supplémentaire est très visible et ne permet pas d'économiser beaucoup de bande passante. – Sylvan

Répondre

12

IE renvoie instantanément l'appel AJAX à partir d'un cache.

Vous devez ajouter un paramètre aléatoire à l'URL pour forcer IE à ignorer son cache, comme ceci:

url: "getUpdates.py?RandomNumber=" + Math.random(), 

(Vous pouvez également utiliser new Date)


En outre, vous devriez probablement vérifier les mises à jour un peu plus lentement en ajoutant un délai de 5 secondes:

complete: function(obj, textStatus){ 
     //handleUpdates(obj); 
    setTimeout(function() { getUpdates(); }, 5000); //milliseconds 
} 
+1

+1 - Je n'ai pas considéré qu'il était en cache, donc désactiver la mise en cache peut résoudre ce problème. Je suppose que la mise en cache est désactivée pour les appels ajax, mauvaise hypothèse. –

+1

merci, j'ai essayé ça et ça a marché comme un charme! Je ne savais pas que les navigateurs mettraient en cache les appels AJAX, merci. – Sylvan

+1

Vous devriez être en mesure d'ajouter le paramètre 'cache: false' à la fonction ajax et il fera le travail d'ajouter un paramètre aléatoire (bien, timestamp) à l'URL pour vous – andyface

Questions connexes