在window.unload上执行ajax调用

时间:2013-10-09 14:11:53

标签: javascript

在我的应用程序中,有一个对象需要在用户切换到另一个页面或关闭浏览器之前回到服务器。

目前,我正在使用这样的东西:

$(window).on('unload', function () {
    $.ajax(....);       
});

ajax是否会在所有浏览器中调用,或者是否存在无效的情况以及需要以不同方式处理这种情况的情况?我不需要在成功函数方面处理任何事情,我只关心将其发送到服务器的信息。

感谢。

4 个答案:

答案 0 :(得分:4)

如果您正在使用jQuery,则可以在ajax调用中将async设置为false。它可能会有效,但您的结果可能因浏览器而异。这是一个jsFiddle示例。 http://jsfiddle.net/jtaylor/wRkZr/4/

// Note:  I came across a couple articles saying we may should to use window.onbeforeunload instead of or in addition to jQuery's unload.  Keep an eye on this.
//        http://vidasp.net/jQuery-unload.html
//        https://stackoverflow.com/questions/1802930/setting-onbeforeunload-on-body-element-in-chrome-and-ie-using-jquery

var doAjaxBeforeUnloadEnabled = true; // We hook into window.onbeforeunload and bind some jQuery events to confirmBeforeUnload.  This variable is used to prevent us from showing both messages during a single event.


var doAjaxBeforeUnload = function (evt) {
    if (!doAjaxBeforeUnloadEnabled) {
        return;
    }
    doAjaxBeforeUnloadEnabled = false;
    jQuery.ajax({
        url: "/",
        success: function (a) {
            console.debug("Ajax call finished");
        },
        async: false /* Not recommended.  This is the dangerous part.  Your mileage may vary. */
    });
}

$(document).ready(function () {
    window.onbeforeunload = doAjaxBeforeUnload;
    $(window).unload(doAjaxBeforeUnload);
});

在Google Chrome浏览器中,ajax调用始终在我离开页面之前完成。

但是,我非常不推荐那条路线。 ajax中的“a”用于“异步”,如果你试图强制执行同步调用,那么你就会遇到麻烦。这种麻烦通常表现为冻结浏览器 - 如果ajax调用需要很长时间,可能会发生这种情况。

如果可行,如果页面包含需要通过ajax发布的数据,请考虑在导航离开页面之前提示用户。有关示例,请参阅此问题:jquery prompt to save data onbeforeunload

答案 1 :(得分:1)

不,不幸的是,您的Ajax调用将无法完成,因为文档将在异步调用期间卸载。 当用户关闭窗口时,您不能做很多事情。

答案 2 :(得分:0)

您必须使用onbeforeunload事件并进行同步AJAX调用。

$.ajax({
    ...
    "url": "http://www.example.com",
    "async": false,
    ...
});

答案 3 :(得分:0)

您可以打开一个弹出窗口,而不是执行ajax同步调用(在最新浏览器上已弃用并且可以获得异常):

$(window).on('unload', function () {
    window.open("myscript.php");
});

您可以在链接中添加明显的参数,如果愿意,您可以自动关闭弹出窗口。 必须在浏览器选项中为您的域停用弹出窗口阻止程序。