Javascript - 在unload / pagehide事件中调用AJAX

时间:2014-02-26 18:42:28

标签: javascript ajax onunload

使用我们的Web应用程序,当用户退出/关闭窗口时,必须使用附带'kill'操作的ajax调用服务器。但是,unload / pagehide事件没有被触发,或者ajax调用没有被执行,我无法确定为什么......

上下文:

  • 不幸的是,我们必须使用香草js;没有jQuery。
  • 我很清楚onbeforeunload,但是对于各种情况,ajax调用不能在该事件中发生(除非有一些神奇的 黑客,我不知道这会抑制默认弹出框 和/或提供了一种查看用户响应的方法。
  • 我们必须兼容IE7 +,FF14 +。无需支持Chrome,Safari,Opera。
  • 我知道ajax功能有效 - 在浏览器处于活动状态并经过全面测试后,它被多次调用。

相关代码......

来自.jsp的代码:

if (window.onpagehide || window.onpagehide === null) {
    addEvent(window, 'pagehide', kill);
} else {
    addEvent(window, 'unload', kill);
}

来自utils文件的代码:

function addEvent(obj, evt, fnc) {

    if (obj.addEventListener) { //W3C
        obj.addEventListener(evt, fnc, false);
        return true;
    } else if (obj.attachEvent) { // MSFT
        return obj.attachEvent('on' + evt, fnc);
    } else { // Legacy

        evt = 'on'+evt;

        if(typeof obj[evt] === 'function') {

            // Object already has a function on traditional
            // Let's wrap it with our own function inside another function
            fnc = (function(f1, f2) {
                return function() {
                    f1.apply(this, arguments);
                    f2.apply(this, arguments);
                }
            })(obj[evt], fnc);
        }

        obj[evt] = fnc;
        return true;
    }

    return false;
};

    function kill() {

        ajax.post({
            "refCallback": null,
            "sURL": "--deleted--",
            "async": false,
            "timeout": 10000,
            "params": {"op": "kill",
                        "guid": guid}});

    };

任何见解或指示都会非常有用......

2 个答案:

答案 0 :(得分:0)

我已经有一段时间了,因为我已经搞乱了onunload和onbeforeunload,但这是我记得的。尝试使用onunload时,您只需要很短的时间来执行任何操作,因为卸载页面的请求已在进行中。通常,您需要在onbeforeunload方法中执行代码。关于你的问题"除非有一些我不知道的魔法黑客抑制了默认弹出框和/或提供了查看用户响应的方法",有一种方法可以禁止默认弹出窗口盒子,但如果你的目的是用自定义的替换它,你运气不好。要使弹出框不显示,只需在onbeforeonload调用中不返回任何内容。

我记得我需要做一些与你所要求的非常相似的事情。我也无法使用JQuery,但我使用了一个调用jsp来删除凭据而不是使用AJAX。我实际上在Stack Overflow上问了一个问题并自己回答:How to logout during onbeforeunload/onunload using Javascript。尝试用你的AJAX调用替换我的jsp调用吗?

下面是与onunload相比unbeforeunload的一个很好的框架示例:

<script type="text/javascript"> //may not be neccesary for your code

window.onbeforeunload=before;
window.onunload=after;

function before(evt)
{
   return "This will appear in the dialog box allong with some other default text";
   //If the return statement was not here, other code could be executed silently (with no pop-up)
}

function after(evt)
{
   //This event fires too fast for the application to execute before the browser unloads
}

</script>

上面的代码是我的答案的结果,我认为是Show popup window when the browser closeOnUnload Alert Error "NS_ERROR_NOT_AVAILABLE"的类似问题。

即使您正在使用onbeforeunload而不是onunload,如果我没记错,如果您不显示弹出窗口,它将无法执行冗长的代码。我知道这个答案并不是你所寻找的,但希望它能引导你走上正确的道路。

答案 1 :(得分:0)

实际上可以在pagehide或unload(已弃用但仍在工作)事件处理程序中执行AJAX请求,但是您需要使此请求同步,否则Safari将抛弃请求。

NamespaceManager