页面卸载时使用 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);
});

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

41638 次浏览

函数和 Ajax 调用看起来都很好,所以我猜测在 Ajax 调用有时间到达服务器并返回之前,浏览器窗口已经关闭。 Ajax 调用可能会在窗口关闭时返回一些内容,尝试在 ajax 调用中添加错误函数,看看情况是否如此:

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

我相信您需要使用 async : false参数来使请求同步(默认情况下是异步的)。

同步请求会锁定浏览器,直到它们完成。如果请求是异步的,则页面继续卸载。它的速度很快,以至于请求根本没有时间发出。

也许你会更成功地使用 onbeforeunload事件而不是?

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

尝试使用 sync = false 调用它;

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

我刚试过了。

HTML5规范指出,alert()prompt()等在 window.unload()事件期间将不可用。详情请参阅 Unload ()。您可以使用 console.log('success');而不是 alert()来检查结果。

最好的解决方案是使用 导航员,发射灯塔。这是一个全新的功能,正开始在新版本的浏览器中得到实现。这个功能可以在比 Chrome39和 Firefox31更新的浏览器中使用。在撰写本文时,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 回调。