jQuery ajax调用onunload处理程序在手动刷新后获取页面时触发。我如何保证首先发生onunload?

时间:2011-02-17 20:27:58

标签: javascript jquery ajax refresh onunload

我有一种情况,在页面卸载我发出删除用户工作草稿的请求。在用户选择刷新页面之前,此工作正常,因此检查Chrome的网络选项卡会显示Chrome正在加载新页面,然后实际触发了ajax请求。结果是页面加载创建了新草稿,然后通过ajax调用立即删除。这基本上就是我在做的事情:

window.onbeforeunload = function(){
    if (pageUpdated){
        return 'Are you sure you want to abandon this draft?';
    }
}

window.onunload = function(){
    $.ajax({
        async: false,
        type: 'DELETE',
        url: '/some/url/'
    });
}

有没有办法在发送新页面请求之前强制onunload处理程序完成?

在Ubuntu 10.04 Lucid上测试浏览器:(Chrome 9,FF 3.6)

4 个答案:

答案 0 :(得分:4)

在onbeforeunload或$ .unload()中使用async = false设置AJAX对象。这将确保在卸载页面之前完成ajax调用。

我知道这个问题已经有几个月了,但我想添加这些信息,以防有人帮助任何人搜索与AJAX类似的问题!

答案 1 :(得分:3)

使XHR请求同步应延迟加载新页面,直到请求完成为止。我不知道jQuery如何运行它的同步XHR请求,但是你可以使用纯JavaScript来实现它:

var request = new XMLHttpRequest();
// or new ActiveXObject("Microsoft.XMLHTTP") for some versions of IE
request.open("GET", "/some/url", false);
request.send(null);

var result = request.responseText;
alert(result);

将它放入卸载处理程序应该让浏览器等到“/ some / url”加载到下一页之前。

答案 2 :(得分:3)

我在这里确认@Silkster的回答。设置选项async = false

后,我可以触发一个AJAX请求

以下是示例代码。

$(window).unload( function () {
    $.ajaxSetup ({
        async: false  
    });
    $.get("target.php");
});

答案 3 :(得分:1)

您可以尝试使用window.onbeforeunload,但我不确定它是否已在所有浏览器中实施。