如何在浏览器标签之间共享单个js资源?

时间:2013-10-01 20:59:11

标签: javascript socket.io local-storage long-polling single-page-application

例如,我想通过socket.io,longpolling等多个选项卡刷新聊天消息......无论我有什么......为此,我想对所有选项卡只使用一个连接。我该怎么做?我可以将常用数据存储在localStore,cookies等中......我需要某种信号量,它只为其中一个选项卡提供单个同步器资源,在该选项卡关闭后,它会提供给另一个选项卡,等等。 ..这怎么可能?我想到的唯一解决方案是告诉localStore onbeforeunload资源是免费的,但这并不适用于每个浏览器。还有其他选择吗?

1 个答案:

答案 0 :(得分:4)

此问题中的关键字是“标签间通信”,“跨窗口消息传递”等...

一种解决方案类似于长轮询:inter-tab-communication-using-local-storage/定期向localStore / cookie询问更改,并添加一个队列来分配公共资源(例如socket.io连接)。您可以使用onbeforeunload或timeout来确定是否导航或关闭选项卡/窗口。在那之后,队列中的下一个选项卡将分配资源...

第二种解决方案是使用“localStore存储事件”。在这种情况下,您不必定期询问localStore(如果onbeforeunload事件可用)。根据这一点:localStorage eventHandler Doesn't Get Called存储事件旨在仅影响其他选项卡,因此它们是intertab通信的不错选择。唯一的问题是onunload:local storage on window unload event。因此,由于缺乏onunload支持,第一种解决方案可能会更好。

第三个解决方案是使用“共享webworkers”,但它们尚未在多个浏览器(Internet Explorer)中实现,或者它们无法打开socket(firefox)。因此,目前它们不是一个选项,可能在修复错误后的1 - 2年后...这是一个演示 - 仅限工作铬 - html5-shared-web-worker-examples

第四个解决方案是window.postMessage,目前尚未完成浏览器支持。我在一些sto问题中读过它,并且他们都写道postMessage不能满足我们的需求。我没有检查有关该功能的确切细节,我认为这不值得...有一个关于跨域交叉iframe通信的示例:Cross-Domain iframe communication但是相同的域跨窗口通信是不可能的认为

第五个解决方案是使用cookie,但在这种情况下,每个选项卡都应该ping document.cookie,因为没有cookie更改事件,比如localstore中的存储事件。 BNC Connector使用此方法。

第六种解决方案是使用WebSQL。它的驱动程序是异步非阻塞,因此它会优于localStorage,但目前它不受firefox和msie的支持。

<强>结论:

现在 - 2013.10.03 - 定期从资源利用者选项卡中ping localStore的最佳选项。其他选项卡应该侦听时间戳更新的存储事件。如果该事件没有及时,则资源utilizer选项卡具有超时,并且队列中的下一个选项卡应获取资源。也许以后onunload事件或共享工作人员将是可靠的,但目前他们还不够好......

<强>解决方案:

我找到了结论中描述的方法的实现: intercom.js 我添加了issue关于资源共享的一般接口,但在我的情况下,单个socket.io资源就足够了......