我们希望每个浏览器只有一个套接字,而不是每个选项卡都有一个。我们该如何实现?我阅读了关于共享Web Workers的文章,这是很有前途的。如果有参考资料就更好了。不幸的是,据我所知,Mozilla或Internet Explorer尚未实现共享Web Workers。那么在这种情况下应该怎么做?我们正在服务器端使用Node.js。
我们希望每个浏览器只有一个套接字,而不是每个选项卡都有一个。我们该如何实现?我阅读了关于共享Web Workers的文章,这是很有前途的。如果有参考资料就更好了。不幸的是,据我所知,Mozilla或Internet Explorer尚未实现共享Web Workers。那么在这种情况下应该怎么做?我们正在服务器端使用Node.js。
我希望我的回答对您有所帮助。
在某些情况下,我使用localStorage对象进行标签之间的通信。localStorage对象具有事件系统,可以告知相同来源的另一个标签或窗口数据已更改(http://www.codediesel.com/javascript/sharing-messages-and-data-across-windows-using-localstorage/)。这个想法是让具有套接字的标签将时间戳和接收到的数据写入本地存储中。如果时间戳过旧 - 可能是因为具有套接字的标签已关闭 - 另一个标签可以启动套接字连接并更新数据和时间戳。
我仍在为我即将开始构建的设计理论化,但我考虑将以下内容进行组合:
-WebSockets -本地存储 和 -跨窗口消息传递
我的理论是在每个选项卡中每次页面加载时在javascript中创建一个套接字引擎,但如果已经有一个已建立的连接,则会关闭。
在首次访问站点时,我会让它创建一个GUID并将其存储在本地存储中,这个guid将唯一标识用户的浏览器/登录到他们的PC。
当套接字服务器接受连接时,它将具有该guid,并且由该guid发出的任何新请求都将返回“999 Connection Already Established”或类似的内容。
一旦运行起来,它将通过将我想要在选项卡之间共享的数据转换为JSON blob,然后在其他选项卡中接收时将其转换回对象,向其他选项卡提供交叉窗口消息。无论哪个选项卡获得连接,都将处理与套接字服务器的所有传入/传出消息。然后它将通过跨窗口消息与其他选项卡接收/发送。理论上,这也应该适用于iframe和弹出窗口。
整个系统将驱动我们正在构建的类似CRM的系统和实时聊天系统以及票务板加载的自动数据刷新。
我的梦想情景是,如果用户A正在查看票1000,而用户B更新了票1000,我希望用户A的票刷新,如果用户A在刷新之前进行了更改,我希望给他们一个数据迁移弹出窗口,以防止删除用户B的更改。
--用户B在您编辑此记录时进行了冲突更改 “UserB:FirstName-> Bob”[接受] “UserA:FirstName-> Robert”[保留]
请查看https://github.com/nodeca/tabex。
您需要为跨标签页通信添加额外的层。Tabex提供了Faye使用示例。其他WebSocket传输(如socket.io等)也可以以类似的方式使用。
实际上,避免这些问题有些困难,例如:在网络不稳定时断开连接。毕竟,网页最初的目的是交换不同的文本文件(如RFC文件),只需要短暂、低成本和不稳定的传输方式(我认为这才是设置HTTP协议的最初目的)
当然,为了解决这个问题,我建议您像上面说的那样使用共享工作者或使用LocalStorage
存储共享和公共部分的信息。
这里是LocalStorage
的基本使用介绍链接。
希望它能真正地帮到您!(其实还没有)