2010-09-06 88 views
4

我必須承認,這是我在這個網站上的第一篇文章,所以如果我做錯了某些事情(格式等​​),我會在意見中道歉。jquery Ajax調用崩潰的Internet Explorer?

無論如何,我創建了一種使用JavaScript(和jQuery)的mmo,到目前爲止,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-polling'。 – SLaks 2010-09-06 02:27:26

+0

爲什麼在再次調用getUpdates()之前不要超時。 – 2010-09-06 02:28:18

+0

服務器需要很長時間才能響應請求(這就是爲什麼有32秒超時限制),某些請求在生成答覆之前最多可能需要30秒。該遊戲是實時的,因此在獲取之間添加額外的客戶端延遲非常明顯,並且不會節省太多帶寬。 – Sylvan 2010-09-06 02:53:26

回答

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調用,不好的假設。 – 2010-09-06 02:31:02

+1

謝謝,我試過了,它的功能就像一個魅力!我沒有意識到瀏覽器會緩存AJAX調用,謝謝。 – Sylvan 2010-09-06 02:51:14

+1

你應該可以將設置'cache:false'添加到ajax函數中,並且它會爲你添加一個隨機(好的,時間戳)參數給URL的工作 – andyface 2014-05-08 12:16:57