2013-01-31 84 views
5

對於dynamic page,我使用Ajax Long Polling,甚至在jQuery 1.9中,Internet Explorer在第一次請求後掛起。

腳本代碼是基於文章Simple Long Polling Example with JavaScript and jQuery

<script type="text/javascript" charset="utf-8"> 
    $(document).ready(function(){ 
    (function poll(){ 
     $.ajax({ url: "ajaxstats.json", success: function(data){ 
     $("button.requests").empty().append(data.requests); 
    }, dataType: "json", complete: poll, timeout: 30000 }); 
    })(); 
    }); 
</script> 

控制檯顯示沒有錯誤。

的IE網絡監視器立即顯示許多請求到ajaxstats.json資源與< 1毫秒一個響應時間和304 (not modified)響應代碼。響應主體是正確的(JSON代碼)。

服務器代碼總是延遲答案1000毫秒。在Firefox中,Firebug XHR日誌顯示每個請求都如預期的那樣需要大約1000毫秒。

HTTP響應代碼是Firefox和Internet Explorer之間不同:

    在Firefox
  • :響應代碼是200 ok在Internet Explorer 9
  • ,響應代碼是304 (not modified)

是否有一種解決這個IE問題的方法?

+1

在控制檯中的任何錯誤?那麼http流量呢? – jbabey

+0

@jbabey看到我的編輯,我將用我在Firefox中的發現進行更新 – mjn

+0

您是否清除了緩存?您正在發出一個GET請求來緩存http響應。如果您希望jQuery向調用添加緩存中斷查詢字符串參數,請將緩存選項設置爲ajax調用。 – epascarello

回答

7

嘗試將緩存參數設置爲false,如果設置爲false,則會強制請求的頁面不被瀏覽器緩存。

<script type="text/javascript" charset="utf-8"> 
    $(document).ready(function(){ 
    (function poll(){ 
     $.ajax({ url: "ajaxstats.json", success: function(data){ 
     $("button.requests").empty().append(data.requests); 
    }, dataType: "json", complete: poll, timeout: 30000, cache: false }); 
    })(); 
    }); 
</script> 
3

在文章中使用setTimeout版本。 timeout選項設置請求的超時時間,而不是等待下一個請求的時間。

有一個reply來自Lars的評論,作者建議。

+0

+1 - 另一個答案也很好 - 很難說我的哪一個是「最好的」 – mjn

+0

事實上,我認爲你有兩個問題:一個是獲得緩存的響應,這可能太快,IE瀏覽器也沒有,似乎正確處理它,馬上開始下一個請求。另一個問題是你希望你的長輪詢工作的方式:它的方式,它不等待下一個請求前30秒,你可以用'setTimeout'版本來完成。 –

+1

這個想法不是在下一個請求前等待30秒,而是保持與服務器的連接處於打開狀態並調用輪詢函數並重新啓動輪詢過程(重新打開連接),只要執行成功或錯誤回調。 – Corneliu

1

我沒有一個很好的答案,爲什麼IE9掛起,而不是IE9只是緩慢的事實。它會間歇性地永久地調用ajax調用的回調。在工作中測試時,我發現在同一個服務器上的同一個Ajax調用在IE9中的時間比在Firefox中的時間多5倍,儘管瀏覽器在同一臺機器上運行。

如果您正在構建一個實時應用程序,並有權訪問它正在運行的實際服務器,我強烈建議您使用Socket.IO。 http://socket.io/最初它是爲node.js構建的,但現在大多數主要語言都有服務器端實現。

客戶端庫有這個回落順序:

  • 的WebSocket
  • 的Adobe Flash插槽
  • AJAX長輪詢
  • AJAX多流
  • 永遠的iFrame
  • JSONP輪詢

在較新的瀏覽器上,您可以獲得真正的Web套接字性能,對於那些不支持它的用戶,您可以免費進行長時間輪詢,但您可以使用相同的純淨Socket.IO接口將它視爲Web套接字。

+0

只是提醒。如果你在使用庫緩存作爲Windows Vista及更高版本時使用某些SO,那麼在使用你使用過的程序時,你將獲得性能提升,因爲所需的庫已經被緩存到內存中。 – rcdmk

相關問題