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

Rob*_*Rob 68 ajax jquery

我正在尝试这样做:

$(window).unload( function () { 

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

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

Nat*_*e B 77

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

同步请求会锁定浏览器,直到完成.如果请求是异步的,则页面将继续卸载.它足够快,请求甚至没有时间发射.

  • 虽然这是正确的答案,但令我不安的是你还没有注意到它是邪恶的***.在慢速网络连接上,您将阻止用户的浏览器以这种方式执行操作. (9认同)
  • 同步请求会锁定浏览器,直到完成.如果请求是异步的,则页面将继续卸载.它足够快,请求甚至没有时间发射. (2认同)

Teb*_*ebo 20

尝试使用async = false调用它;

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

我刚尝试过.


小智 13

最好的解决方案是使用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);
};
Run Code Online (Sandbox Code Playgroud)

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


Mar*_*arz 0

您的函数和 Ajax 调用看起来很好,所以我的猜测是您的浏览器窗口在 ajax 调用有时间往返服务器之前就已关闭。当窗口关闭时,ajax 调用可能会返回一些内容,请尝试在 ajax 调用中添加错误函数以查看是否是这种情况:

error: function (xhr, textStatus) {
    alert('Server error: '+ textStatus);
}
Run Code Online (Sandbox Code Playgroud)