2012-02-28 83 views
1

我只是想知道爲什麼這不與IE瀏覽器一起工作。它適用於Chrome和Firefox。onBeforeUnload with ajax無法與IE

window.onbeforeunload = function() 
{ 
    fetch("http://"+window.location.hostname+"/process_sc.php?cC=" + 1); 
} 

function fetch(url) { 
    var x = (window.ActiveXObject) ? new ActiveXObject('Microsoft.XMLHTTP') : new XMLHttpRequest(); 
    x.open("GET", url, false); 
    x.send(null); 
} 
+0

你爲什麼要在「onbeforeunload」上調用Ajax .... – 2012-02-28 10:39:59

+0

https://developer.mozilla.org/zh-CN/DOM/window.onbeforeunload – Joseph 2012-02-28 10:46:05

+0

@Sudhir爲什麼?還有其他方法嗎? – jaypabs 2012-02-28 12:01:46

回答

1

你怎麼知道它不工作?

在一般情況下,幾乎沒有時間之間beforeunload事件,卸載事件和實際的頁面退出。在頁面卸載時,所有正在運行的腳本都將被刪除(例如,瀏覽器會關閉窗口或導航到用戶提供的地址)。

這裏可能發生的情況是瀏覽器沒有時間在頁面卸載前發送ajax請求。

我已經看到了幾種方法來確保在頁面卸載完成之前您的最終請求。其中之一是發送請求,然後引入運行X數毫秒的循環,推遲卸載事件並確保可以完成一個jax請求。

window.onbeforeunload = function() { 
    fetch("http://"+window.location.hostname+"/process_sc.php?cC=" + 1); 
    // here we force browser to wait for 300 seconds before proceeding with unload 
    var t = Date.now() + 300; 
    while(Date.now() < t) {}; 
} 
+0

嗨,它只適用於我第一次打開IE瀏覽器。我在process_sc.php文件上有一個php代碼,它在每次執行此url時遞增我表中的值1:http://「+ window.location.hostname +」/process_sc.php?cC=「+ 1. When我點擊第二次上面的代碼頁面上的鏈接,似乎它不調用提取函數,因爲我的表中的值不再增加。 – jaypabs 2012-02-28 12:00:35

+0

當我雙擊出站鏈接時調用獲取函數兩次這是可以的但唯一的問題是它不會觸發x.open(「GET」,url,false); – jaypabs 2012-02-28 12:49:22

+0

螢火蟲或其他控制檯是否會報告任何javascript錯誤? – WTK 2012-02-28 13:30:15

1

問題是您使用GET而不是POST請求。瀏覽器可以使用來自第一個請求的緩存結果。

這解釋了「它只在我第一次打開IE時才起作用」這一事實,因爲它是對另一個答案的迴應。

順便說一下,只要您使用XMLHttpRequest.open(...)中的參數async = false(您已經這麼做),onunload中的AJAX調用似乎可以在IE10中可靠地工作。