2011-11-30 114 views
2

不工作這是我非常簡單的代碼片段:jQuery的卸載與AJAX調用在Chrome

$(window).unload(function() { 
     $.ajax({ 
      url: 'stats_pages.php?last_id='+$("#last_id").val(), 
     }); 
}); 

夠簡單。 Firefox中的AJAX調用完美調用,但在Chrome中失敗。我試過其他的變化,哪種類型的工作:「你確定要離開這個頁面」

window.onbeforeunload = function(){ 
     $.ajax({ 
      url: 'stats_pages.php?last_id='+$("#last_id").val(), 
     }); 
     return false; 
} 

這個工程在瀏覽器,但它提醒「假」與通常的消息,這不是我想要的。沒有return false;,它不會觸發AJAX調用。

理想情況下,我喜歡第一個解決方案最好,但是有人知道發生了什麼嗎?

+0

而不是寫'返回false'如果你寫'alert('something')'會發生什麼?我不知道它只是爲了測試它是否是一個關於異步性的問題(它會給你一個延遲它的機會)? – kamaci

回答

11

集ASYNC:在你的Ajax調用

$(window).unload(function() { 
     $.ajax({ 
      url: 'stats_pages.php?last_id='+$("#last_id").val(), 
      async : false, 
     }); 
}); 
+0

D'oh!我早些時候遇到過這個解決方案,但是我在其他地方發現了錯誤,這導致我認爲這不起作用。 Bah,抱歉轉貼!不過謝謝你。 – id2341677

+0

很高興你能工作。 –

+13

這個解決方案是否仍然有效?我將async設置爲false,即使事件被觸發,我的AJAX調用仍然不會被接收。 –

2

截至今日假的,這仍然會失敗,Chrome瀏覽器新版本。問題在於卸載事件和Chrome。從Chrome 14開始,它似乎就成了一個問題。您可以從jQuery漏洞檢測更多地瞭解這個問題:http://bugs.jquery.com/ticket/10509

還有上面鏈接中列出Chrome瀏覽器修復:以上

window.onbeforeunload = function() { 
    $.ajax({ 
     url: 'stats_pages.php?last_id='+$("#last_id").val(), 
     async : false, 
    }); 
} 
0

既不的解決方案是可以接受我。第一個原因是因爲異步AJAX調用可能導致客戶端在服務器速度較慢時表現不佳,第二個因爲我們已經使用onbeforeunload事件來生成「Are you sure?」用戶離開頁面進行更改的消息。我嘗試了setTimeout和jQuery的delay(),但是我得出的結論是,只要線程進入睡眠模式,Chrome就會終止線程,顯然AJAX調用需要一點時間來制定對它的請求成功的。因此,最終我能夠通過一個非常低技術的循環來解決這個問題,該循環從不將線程置於睡眠狀態,並使線程繼續運行50毫秒。

var start = new Date().getTime(); 
for (var i = 0; i < 1e7; i++) { 
    if ((new Date().getTime() - start) > 50) { 
     return; 
    } 
} 

隨着這一變化,AJAX調用現在正確地觸發在Chrome中,而客戶端沒有noticable滯後。