使用AJAX调用的jQuery卸载无法在Chrome中运行

时间:2011-11-30 18:28:25

标签: javascript jquery ajax onbeforeunload

这是我非常简单的代码段:

$(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调用。

理想情况下,我最喜欢第一种解决方案,但是有人知道发生了什么吗?

3 个答案:

答案 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中正确触发,客户端没有明显的延迟。