我正在努力:
$(window).unload( function () { $.ajax({ type: "POST", url: "http://localhost:8888/test.php?", data: "test", success: function(msg){ alert( "Data Saved: " + msg ); } }); alert (c); });
但是,从未显示成功警报,这个请求似乎也没有击中服务器。我做错了什么?
函数和 Ajax 调用看起来都很好,所以我猜测在 Ajax 调用有时间到达服务器并返回之前,浏览器窗口已经关闭。 Ajax 调用可能会在窗口关闭时返回一些内容,尝试在 ajax 调用中添加错误函数,看看情况是否如此:
error: function (xhr, textStatus) { alert('Server error: '+ textStatus); }
我相信您需要使用 async : false参数来使请求同步(默认情况下是异步的)。
async : false
同步请求会锁定浏览器,直到它们完成。如果请求是异步的,则页面继续卸载。它的速度很快,以至于请求根本没有时间发出。
也许你会更成功地使用 onbeforeunload事件而不是?
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()来检查结果。
alert()
prompt()
window.unload()
console.log('success');
最好的解决方案是使用 导航员,发射灯塔。这是一个全新的功能,正开始在新版本的浏览器中得到实现。这个功能可以在比 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 回调。