检测用户是否关闭了网站的所有窗口?

7
我了解这个:

我知道这件事:

window.onbeforeunload = function() {
   //tell server user has left your site
};

但是有没有客户端的方法使用JavaScript来检测用户是否已经关闭了您网站的所有浏览器窗口?

还是我需要服务器端代码来检测这个?


你想知道的是,在onbeforeunload事件中,是否仍有一个打开的标签页?在任何浏览器中还是在同一浏览器中? - Denys Séguret
@NickDugger 这就是 onbeforeunload 的作用。当用户关闭标签页时,它会执行(这就是“您真的要离开此页面吗?”消息的工作原理)。 - blex
2个回答

6
你可以将信息保存到LocalStorage中来检测任何存在。
一些想法:在加载时,将值写入sessionStorage:
window.onload = function() {
    if (sessionStorage.instances) {
        sessionStorage = Number(sessionStorage.instances) + 1;
    } else {
        sessionStorage.instances = 1
    }
}

在卸载时减少该值:

window.onbeforeunload = function() {
    var instances;

    if (sessionStorage.instances) {
        instances = Number(sessionStorage.instances) - 1;
        sessionStorage.instances = instances;
        if (0 === instances) {
            // all instances closed
        }
    }
}

你好 Ralf

PS: 示例取自http://www.w3schools.com/html/html5_webstorage.asp并进行了一些修改 ;)


+1 但不要忘记处理崩溃(可以使用会话超时等机制)。 - Adriano Repetti
好的,那么您可以使用SessionStorage。 - RWAM
@RwamDev,谢谢!你能给我一个LocalStorage/SessionStorage的代码样例吗? - tim peterson
1
为什么会有负评?!回答可以通过一个简短的代码示例进行改进,但其实已经是正确的了... - Adriano Repetti
1
@RwamDev 我没有给你的点子投反对票,我支持你。但是你需要在每个客户端断开连接的确切时间上设置一个事件吗?还是只需在启动时检查一个实例?我可能有点过度了,但这里是一个可能有效的示例,当然你不能依赖这样的函数:http://jsfiddle.net/BZTw3/4/ - Nico O
sessionStorage在不同的标签页之间不会保留。每个新标签页都会生成一个新的会话。 - Drakes

0

你可以生成一个带有前缀(例如closed_tab_)和后缀(可以是时间戳或uuid)的cookie。当关闭窗口时,删除由该标签设置的cookie,并检查是否存在使用相同命名方案的其他cookie。 这样即使没有本地存储的浏览器也可以解决问题。 至于崩溃的浏览器- 您可以使用每秒钟的定时器来更新cookie,并将其设置为每秒过期一次。 如果您不那么注重时间,可以将其设置为较大的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接