3

我有一种情况,在页面卸载时,我发出了删除用户作品草稿的请求。这工作正常,直到用户选择刷新页面,然后检查 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 处理程序完成?

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

4

4 回答 4

4

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

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

于 2011-08-12T15:19:58.910 回答
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”被加载后再移动到下一页。

于 2011-05-22T02:58:05.657 回答
3

我来这里是为了确认@Silkster 的回答。设置选项 async = false 后,我可以触发 AJAX 请求

这是示例代码。

$(window).unload( function () {
    $.ajaxSetup ({
        async: false  
    });
    $.get("target.php");
});
于 2012-09-19T12:36:35.197 回答
1

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

于 2011-02-17T20:31:31.123 回答