页面上带有JQuery的Ajax请求卸载


70

我正在尝试这样做:

$(window).unload( function () { 

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

但是,永远不会显示成功警报,该请求似乎也没有击中服务器。我究竟做错了什么?

Answers:


81

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

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


谢谢。您是否有解释为什么这一个必须是同步的?
zigomir 2012年

2
同步请求将锁定浏览器,直到完成。如果请求是异步的,则页面只会继续卸载。它足够快,以至于请求甚至都没有时间触发。
Nate B

这是否意味着有机会,如果浏览器卸载时间过长(可能是硬盘驱动器问题),有时可能会发送请求?还是永远不会发送。只是好奇。
Farzher

11
虽然这是正确的答案,但令我感到不安的是,您还没有注意到这是邪恶的。在慢速的网络连接上,您将以这种方式使用户的浏览器停止运行。
Mark Amery

没什么不同
user3953989 '16

21

尝试使用async = false调用它;

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

我刚试过


14

最好的解决方案是使用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);
};

但是,此函数不允许您注册成功回调。


1
目前,它仍被列为实验性的,“语法和行为……在将来的版本中可能会发生变化”
Jeff Walker Code Ranger

更新:编写此答案时可能并不为人所知,但是sendBeacon不应unloadandbeforeunload事件一起使用,因为它可能无法可靠地触发,而visibilitychange应使用事件。有关更多信息,请参见MDN文档。
亨利·弗洛伊德

3

的HTML 5规范规定alert()prompt()的期间等,将不会提供window.unload()事件。请参阅window.unload()了解更多详细信息。您可以使用console.log('success');代替来检查结果alert()



0

您的函数和Ajax调用看起来不错,所以我猜测是在ajax调用有时间进入服务器并返回之前,浏览器窗口已关闭。窗口关闭时,ajax调用可能返回一些信息,请尝试向您的ajax调用添加错误功能,以查看是否为这种情况:

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

1
我真的不需要它“回来”(即,没有必要发出成功警报,仅用于调试目的)。但是,我确实需要在卸载完成之前触发ajax请求。
罗布
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.