如何区分页面刷新和关闭页面

时间:2009-05-17 20:09:07

标签: php javascript

我有一个网络应用程序游戏,而在游戏中我想拥有它,所以如果用户关闭页面或他们的浏览器,它会自动注销它们。我尝试使用附加到窗口的onbeforeunload事件:

window.onbeforeunload = function() {
    // perform logout functions here
}

问题是,如果用户刷新页面,也会触发。有没有办法可以检测用户是否完全关闭整个页面,或者只是刷新它?

4 个答案:

答案 0 :(得分:8)

没有可检测到的差异。要自动注销用户,您应该在存储登录或会话信息的cookie上设置到期日期。因此,如果您将其设置为1小时,那么在该时间之后用户将基本上被注销,因为cookie将被销毁。如果您想在他们仍然与网站交互时推迟此自动注销,您可以在每次执行某种操作(单击链接,激活AJAX调用等)时重置cookie的过期。这意味着他们将在1小时不活动后退出登记,而不是登录后1小时,这听起来更像你想要的。

如果您将Cookie的到期时间设置为0,那么它会在会话结束后到期。这通常发生在用户完全退出浏览器时。这也是另一种选择。

答案 1 :(得分:2)

如上所述,你不能。更糟糕的是,很多浏览器已经放弃了这个事件,可能是因为恶意脚本滥用了pop-under等等。

一种可能的解决方法是让Ajax脚本“打电话回家”:如果它静默了一段时间,用户就放弃了网站(关闭的页面或浏览器)。

答案 2 :(得分:2)

让onunload事件向服务器发送请求,这将导致会话在n秒内到期(其中n是页面重新加载请求发生的最长时间,因此可能为10)。然后让站点的脚本检查是否已安排该事件,如果是,请取消它。这会给你你想要的行为。

但是,我建议只是让会议到期。

答案 3 :(得分:0)

如果我没弄错,Javascript应该有一个名为onWindowClose的函数,也许可以尝试搜索它?

关于PHP解决方案,我不确定是否有,但我建议您快速查看PHP Connection Handling,特别是connection_aborted()和register_shutdown_function()函数。