2011-02-26 35 views
6

此问题已被困住了几天,真的需要,并希望得到一些帮助。我的要求是,我想要做一个服务器端回调,以清除掉一些对象,当用户离开我们的页面,而不点击注销。出于商业原因,我们的ASP.NET会话超时必须设置为非常高的值。此外,我不想弹出警告/对话框来强制用户返回页面并单击注销。Chrome/Safari在某些情况下未调用卸载程序

我到目前为止的解决方案是通过在页面中嵌入此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一样。这甚至有可能吗?

在此先感谢您的帮助,

Rajesh。

回答

8

使用beforeunload事件而不是卸载事件。

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

我不知道如何使用JavaScript框架来执行同步AJAX请求。在jQuery中,它应该是这样的:

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

我认为只有后面的建议 - 使用同步ajax请求 - 是必要的。 'beforeunload'事件用于确认用户实际想要离开该页面。 – 2011-02-26 02:52:56

+0

非常感谢你们。马上试试这个。 – Rajesh 2011-02-28 16:28:33

+0

+1此解决方案适用于Chrome和Firefox,但不适用于IE9(不知道为什么我害怕)。此外,对于Chrome,它仅适用于我在Unload事件中的情况 – 2012-04-16 12:58:23

1

如果有人遇到这样的未来,我无法使用window.onbeforeunload,因为它是太早射击。相反,我发现window.onpagehide是一个合适的解决方法。

例如

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