我们希望每个浏览器有一个套接字,而不是浏览器中的每个选项卡一个。我们怎样才能实现它?我读到了很有希望的共享网络 worker 。对此的引用也值得赞赏。不幸的是,据我所知,Mozilla 或 Internet Explorer 尚未实现共享网络 worker 。那么在这种情况下该怎么办呢?我们正在服务器端开发 node.js。
最佳答案
看到这个问题后,我终于实现了共享套接字,并在几天前添加到我的库中。它似乎适用于大多数浏览器,甚至包括 IE6,但 Opera 除外。对于 Opera,您可以使用常规检查而不是卸载事件。
在 https://github.com/flowersinthesand/portal/issues/21 上查看相关问题
###留下一个cookie
- 设置 cookie 以通知存在共享套接字。
- 当套接字关闭时,删除该 cookie 以通知没有共享套接字。
###共享和使用共享套接字
- 使用存储事件和 localStorage - localStorage 在设置和删除值时触发存储事件。
- 检查是否支持 StorageEvent 和 localStorage。
- 添加按键过滤事件的存储事件处理程序。我用socket的url作为key
- 增加socket的关闭事件,移除存储属性
- 要发出信号,请使用前一个键将数据设置为存储
- 使用 window.open 方法 - 如果我们知道共享窗口的名称,我们可以获取该窗口的引用并访问其属性。
- 每个浏览器都支持 window.open 方法,但某些浏览器(例如 Chrome)禁止访问返回的窗口的属性。
- 获取或创建以 name 属性为 key 的 iframe。我使用了socket的url,但是注意IE不允许在iframe标签的name属性中使用非单词字符。
- Iframe 的 contentWindow 是一个共享窗口引用。设置回调变量来存储每个窗口的监听器。
- 要发出信号,只需使用数据调用回调即可。请注意,IE 8 及更低版本只允许将字符串传递给其他窗口的函数,并且共享窗口可能会被破坏。
注意
- 在上面的实现中,信令是广播,所以数据应该指明目标。我使用了目标属性,p 代表父项,c 代表子项。
- 我使用了附加变量来共享套接字:opened - 共享套接字是否打开,children - 共享者列表。代码和注释将帮助您了解详细信息。
希望我的回答对你有帮助。
关于javascript - 跨浏览器选项卡共享 websocket?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9554896/