Chrome / Safari在某些情况下不会调用卸载

时间:2011-02-26 02:11:14

标签: javascript asp.net ajax

现在已经坚持这个问题几天了,真的需要,并希望得到一些帮助。我的要求是,当用户导航离开我们的页面时,我想进行服务器端回调以清除某些对象,而不单击注销。出于商业原因,我们的ASP.NET会话超时必须设置为非常高的值。此外,我不想弹出警告/对话框以强制用户返回页面并单击“注销”。

我到目前为止所提出的解决方案是通过在页面中嵌入此javascript来进行AJAX回调。

window.onunload = pageleave;
     function pageleave() {                  
                  alert('test');
                  PageMethods.CheckLogout('abc','xyz',OnSucceed,OnFail);                  
      }     

这是问题所在: 对于IE和Firefox,卸载会触发,会看到警报,在我想要的所有情况下,我都会在C#端看到回调

    a)  User closes browser 
    b)  User types in a new URL in the address bar 
    c)  User clicks on a link causing page to reload

对于Chrome和Safari,案例a和b工作正常。但是,当用户单击链接时,会导致我的aspx页面重新加载,我的C#端代码不会被调用。 javasacript警报虽然被解雇了。

我试图了解如何让Chrome / Safari像IE / Firefox一样运行。这甚至可能吗?

提前感谢您的帮助,

拉​​杰什。

2 个答案:

答案 0 :(得分:8)

使用beforeunload事件而不是unload事件。

此外,使用同步AJAX请求,而不是异步请求,以便在beforeunload函数退出之前完成请求。

我不确定如何使用JavaScript框架执行同步AJAX请求。在jQuery中,它看起来像这样:

window.onbeforeunload = function() {
    jQuery.ajax({
        url: '/page/to/load',
        async: false
    });
};

答案 1 :(得分:1)

如果将来有人遇到这种情况,我就无法使用window.onbeforeunload,因为它过早发射。相反,我发现window.onpagehide是一种合适的解决方法。

e.g。

window.onpagehide = function() {
    // some code here.
};