这是我非常简单的代码段:
$(window).unload(function() {
$.ajax({
url: 'stats_pages.php?last_id='+$("#last_id").val(),
});
});
足够简单。 AJAX调用在Firefox中完美调用,但在Chrome中失败。我尝试了其他变体,这些工作:
window.onbeforeunload = function(){
$.ajax({
url: 'stats_pages.php?last_id='+$("#last_id").val(),
});
return false;
}
这适用于Chrome,但它通常会以“您确定要离开此页面吗?”警告“虚假”。消息,这显然不是我想要的。如果没有return false;
,它就不会激活AJAX调用。
理想情况下,我最喜欢第一种解决方案,但是有人知道发生了什么吗?
答案 0 :(得分:11)
在你的ajax调用中设置ASYNC:false
$(window).unload(function() {
$.ajax({
url: 'stats_pages.php?last_id='+$("#last_id").val(),
async : false,
});
});
答案 1 :(得分:2)
截至今天,使用较新版本的Chrome仍然会失败。问题出在卸载事件和Chrome上。自Chrome 14以来,这似乎是一个问题。您可以从jQuery错误故障单中了解有关该问题的更多信息:http://bugs.jquery.com/ticket/10509。
上面的链接中还列出了Chrome修复程序:
window.onbeforeunload = function() {
$.ajax({
url: 'stats_pages.php?last_id='+$("#last_id").val(),
async : false,
});
}
答案 2 :(得分:0)
上述任何一种解决方案都不适合我。第一个因为异步AJAX调用会导致客户端在服务器运行缓慢时表现不佳,第二个因为我们已经使用onbeforeunload事件来生成"你确定吗?"用户离开他们已进行更改的页面的消息。我尝试了setTimeout和jQuery的延迟(),但我得出的结论是,一旦线程进入睡眠模式,Chrome就会杀死线程,显然AJAX调用需要一点时间来制定要求它成功。所以最终我能够通过一个非常低技术的循环来解决这个问题,这个循环永远不会让线程进入睡眠状态,并使线程继续运行50毫秒。
var start = new Date().getTime();
for (var i = 0; i < 1e7; i++) {
if ((new Date().getTime() - start) > 50) {
return;
}
}
通过此更改,AJAX调用现在可以在Chrome中正确触发,客户端没有明显的延迟。