Javascript 检测是否存在同一域的其他选项卡/窗口

Javascript 检测是否存在同一域的其他选项卡/窗口,javascript,html,cross-browser,Javascript,Html,Cross Browser,如果我在同一个域中打开了两个(或更多)选项卡,是否有一种简单的方法来感知另一个选项卡的存在(以便控制我的计算)?我知道有一个window.open()函数,但我不是从一个窗口打开另一个窗口。相反,想象一个用户使用两个选项卡访问mydomain.com 我已经开始编写一些使用HTML5本地存储的代码,我会定期留下消息并检查消息,但这似乎有点复杂。使用HTML5会话存储,您可以在windows之间共享数据,因此,您可以在每次打开给定域的窗口时增加会话存储变量。在localStorage中设置计数器(

如果我在同一个域中打开了两个(或更多)选项卡,是否有一种简单的方法来感知另一个选项卡的存在(以便控制我的计算)?我知道有一个window.open()函数,但我不是从一个窗口打开另一个窗口。相反,想象一个用户使用两个选项卡访问mydomain.com


我已经开始编写一些使用HTML5本地存储的代码,我会定期留下消息并检查消息,但这似乎有点复杂。

使用HTML5会话存储,您可以在windows之间共享数据,因此,您可以在每次打开给定域的窗口时增加会话存储变量。

在localStorage中设置计数器(打开新选项卡时增加计数器),并在关闭选项卡时根据onbeforeunload减少计数器不是可靠的解决方案,因为如果您强制退出浏览器,onbeforeunload侦听器将不会执行,因此计数器不会递减

假设您打开了1个选项卡,并且“tabs\u opened”本地存储计数器为1。由于某些原因,您必须强制退出浏览器。当您重新打开浏览器并重新访问同一网站时,“tabs_open”计数器现在将变为2,因为“tabs_open”计数器未递减


很抱歉,我所说的不完全是一个答案(但我不能添加评论,因为我没有足够的声誉添加评论)。我只想指出这个边缘案例。

这是一个有趣的问题

我们可以尝试以下api: postMessage、会话存储、本地存储、webRtc

这套衣服很好:

BroadcastChannel允许来自同一来源但其他来源的脚本 浏览上下文(窗口、工作人员)以相互发送消息

BroadcastChannel接口表示任何 给定来源的浏览上下文可以订阅。它允许 不同文档之间的通信(在不同的窗口、选项卡、, 帧或iFrame)相同原点的。信息是通过广播系统广播的 在侦听的所有BroadcastChannel对象上激发的消息事件 频道

它与PostMessageAPI的不同之处在于,子窗口并不意味着要在父页面中声明。这样就没有了父母和孩子

发送示例:

new BroadcastChannel('myapp').postMessage('Hello?');
接收示例:

new BroadcastChannel('myapp').addEventListener('message', function(e){
  console.log(e.data) 
})
这样,我们可以统计选项卡,甚至可以将当前活动状态通知其他选项卡,等等

此帖子发布后的使用反馈。BroadcastChannel api非常简单,但允许重新思考体系结构

这允许模块相互对话,这简化了脚本的组成

我不觉得有必要用网页组合脚本来构建复杂的东西。我们可以通过通道共享json编码的对象,在需要时调用«服务»,分离逻辑、模板、工厂、事件、服务,这要容易得多

这是内存使用和性能的关键。我们可以创建多个通道并行传输一些大的数据流,这对ram/cpu和接口响应性没有影响

更少的变量,更少的逻辑,广播的数据被直接丢弃。编码风格与WebSocket非常相似,这只是一个本地套接字

--


好的,但假设窗口1出现,我的变量numWindows现在是1。窗口2出现,numWindows=2。如果窗口1关闭,我无法递减,因为我无法预测何时会发生这种情况,因此我的计数器将关闭。或者我可以使用存储事件?您可以使用event window.onbeforeunload检测窗口何时关闭,这样您就可以在那一刻执行一些代码。我检查了这个。1.会话存储被限制在特定的浏览器窗口中,因此必须使用本地存储。还有竞争条件的可能性,即对本地存储的更新不是原子性的。您能找到解决方案吗?