2010-09-06 3 views
4

Должен признаться, это мой первый пост на этом сайте, поэтому я извиняюсь в советах, если я что-то делаю неправильно (форматирование и т. Д.).Jquery Ajax вызывает сбой Internet Explorer?

В любом случае, я создаю вид mmo с использованием javascript (и jQuery), и до сих пор все работает нормально в Chrome, Safari, Firefox и т. Д. Однако я обнаружил, что где-то вдоль линии Интернет Происходит сбой.

Воспроизводя аварии я сузил его к этому коду:

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(); 
     } 
    }); 
} 

который должен опрашивать для обновления в течение длительного времени. Однако в IE после одного ответа этот код застревает в бесконечном цикле, что приведет к сбою браузера. Кажется, что это не сбой после каждого ответа, только если ответа сервера нет.

Обратите внимание, линия, которая говорит "полная: ..." было опробовано как:

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

с той же проблемой возникновения.

+1

Похоже, вы все сделали правильно. . поздравления! Однако, вероятно, вы должны добавить теги 'javascript' и/или' ajax' вместо 'long-poll'. – SLaks

+0

Почему бы не поставить таймаут перед вызовом getUpdates() еще раз. –

+0

сервер занимает много времени, чтобы отвечать на запросы (поэтому существует ограничение на 32 тайм-аута), некоторые запросы могут занять до 30 секунд до получения ответа. Игра в режиме реального времени, поэтому добавление дополнительной задержки на стороне клиента между получателями очень заметно и не сэкономит много трафика. – Sylvan

ответ

12

IE мгновенно возвращает вызов AJAX из кеша.

Вы должны добавить случайный параметр в URL, чтобы заставить IE игнорировать кэш, например:

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

(Вы можете также использовать new Date)


Кроме того, вы должны, вероятно, проверьте обновления немного медленнее, добавив 5-секундную задержку:

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

+1 - Я не считал, что он кэширован, поэтому отключение кэширования может решить эту проблему. Я просто предполагаю, что кэширование отключено для вызовов ajax, плохое предположение. –

+1

спасибо, я попробовал это, и это сработало как шарм! Я не понял, что браузеры будут кэшировать вызовы AJAX, спасибо. – Sylvan

+1

Вы должны иметь возможность добавить параметр 'cache: false' в функцию ajax, и он выполнит задачу добавления случайного (ну, отметки времени) параметра в URL-адрес для вас. – andyface

Смежные вопросы