在页面卸载时使用JQuery的Ajax请求

时间:2009-11-30 18:44:08

标签: jquery ajax

我正在尝试这样做:

$(window).unload( function () { 

$.ajax({
    type: "POST",
    url: "http://localhost:8888/test.php?",
    data: "test",
    success: function(msg){
         alert( "Data Saved: " + msg );
    }
}); 
alert (c);
});

但是,从未显示成功警报,此请求似乎也没有显示在服务器上。我做错了什么?

6 个答案:

答案 0 :(得分:76)

我认为您需要使用async : false参数使请求同步(默认为异步)。

同步请求会锁定浏览器,直到完成为止。如果请求是异步的,则页面将继续卸载。它的速度非常快,以至于请求永远都没有时间启动。

答案 1 :(得分:20)

尝试使用async = false;

进行调用
jQuery.ajax({url:"http://localhost:8888/test.php?", async:false})

我刚尝试过。

答案 2 :(得分:11)

最佳解决方案是使用navigator.sendBeacon。它是全新的功能,开始在新版本的浏览器中实现。该功能适用​​于比Chrome 39和Firefox 31更新的浏览器。在撰写本文时,Internet Explorer和Safari不支持此功能。要确保您的请求在不支持新功能的浏览器中发送,您可以使用此解决方案:

var navigator.sendBeacon = navigator.sendBeacon || function (url, data) {
  var client = new XMLHttpRequest();
  client.open("POST", url, false); // third parameter indicates sync xhr
  client.setRequestHeader("Content-Type", "text/plain;charset=UTF-8");
  client.send(data);
};

此功能不允许您注册onsuccess回调。

答案 3 :(得分:3)

HTML 5规范声明在alert()事件期间prompt()window.unload()等将无法使用。有关详细信息,请参阅window.unload()。您可以使用console.log('success');代替alert()来检查结果。

答案 4 :(得分:1)

也许您使用onbeforeunload事件取得更多成功?

   $(window).bind('beforeunload', ...

答案 5 :(得分:0)

你的函数和Ajax调用看起来很好,所以我的猜测是你的浏览器窗口关闭,然后ajax调用有时间去服务器并返回。 当窗口关闭时,ajax调用可能会返回一些内容,尝试向您的ajax调用添加错误函数,看看是否是这种情况:

error: function (xhr, textStatus) {
    alert('Server error: '+ textStatus);
}