使用ajax onBeforeUnload不能与IE一起使用

时间:2012-02-28 10:33:11

标签: javascript ajax

我只是想知道为什么这不适用于IE。它适用于Chrome和Firefox。

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

2 个答案:

答案 0 :(得分:1)

你怎么能说它不起作用?

通常, beforeunload 事件,卸载事件和实际页面退出之间的时间很短。在页面卸载时,所有正在运行的脚本都被删除(浏览器比关闭窗口或导航到用户提供的地址)。

这里可能发生的事情是浏览器在卸载页面之前没有时间发送ajax请求。

在页面卸载完成之前,我已经看到了几种确保最终请求的方法。其中一个是发送请求,然后引入运行X个毫秒的循环,推迟卸载事件并确保完成ajax请求。

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

答案 1 :(得分:1)

问题是您使用GET而不是POST请求。浏览器可以使用来自第一个请求的缓存结果。

这解释了“它只在我第一次打开IE时才起作用”的事实,就像回复另一个答案一样。

顺便说一下,onunload中的AJAX调用似乎只在你使用async = false中的参数XMLHttpRequest.open(...)时才能在IE10中可靠地工作。