我想用JavaScript检查用户是否已经在浏览器的另一个选项卡中打开了我的网站。
看来pagevisibility不行啊......
我看到的唯一方法是使用基于会话cookie的WebSocket,并检查客户端是否有多个套接字。但这样一来,从当前选项卡,我必须询问我的服务器,如果这个用户有一个选项卡打开的权利旁边,他们的当前浏览器选项卡。这是有点牵强!
也许用localstorage
?
我想用JavaScript检查用户是否已经在浏览器的另一个选项卡中打开了我的网站。
看来pagevisibility不行啊......
我看到的唯一方法是使用基于会话cookie的WebSocket,并检查客户端是否有多个套接字。但这样一来,从当前选项卡,我必须询问我的服务器,如果这个用户有一个选项卡打开的权利旁边,他们的当前浏览器选项卡。这是有点牵强!
也许用localstorage
?
4条答案
按热度按时间ma8fv8wu1#
我知道现在很晚了,但也许能帮助别人
这段代码将检测有多少选项卡是打开的,有多少是活动的(可见的),如果没有选项卡是活动的,它将选择最后打开的选项卡,作为活动的。
这段代码也会处理windows/tab崩溃,并且会在崩溃时刷新计数。
由于堆栈溢出当前不支持localStorage,请测试here。
ilmyapht2#
带有
localStorage
和存储监听器的较短版本更新日期:
chrome://inducebrowsercrashforrealz
个Live demo
brc7rcf03#
使用本地存储,我创建了一个简单的演示,它应该可以完成你想要做的事情。基本上,它只是维护当前打开的窗口的计数。当窗口关闭时,unload事件触发,并将其从总窗口计数中删除。
当你第一次看到它的时候,你可能会认为它比实际情况要复杂得多。它的大部分内容都是为了给谁是“主”窗口以及在关闭子窗口时谁应该接管“主”窗口添加逻辑。(因此setTimeout调用来重新检查它是否应该被提升到主窗口)经过一些思考之后,我认为这将花费太多的时间来实现,并且超出了这个问题的范围。但是,如果您打开了两个窗口(主窗口和子窗口),并且您关闭了主窗口,则子窗口将被提升为主窗口。
在大多数情况下,您应该能够获得正在发生的事情的一般概念,并将其用于您自己的实现。
请在此处查看所有操作:http://jsbin.com/mipanuro/1/edit
哦,是的,要真正看到它的运行...在多个窗口中打开链接。:)
更新:
我已经做了必要的修改,让本地存储保持“主”窗口。当你关闭标签时,子窗口可以升级为主窗口。有两种方法可以通过传递给WindowStateManager的构造函数的参数来控制“主”窗口的状态。这个实现比我以前的尝试要好得多。
JavaScript程式码:
HTML格式:
CSS格式:
ruarlubt4#
**(2021)**您可以使用BroadcastChannel在相同来源的选项卡之间进行通信。
例如,将以下代码放在js代码的顶层,然后打开2个标签进行测试: