看到这个问题后,我终于实现了共享套接字并在几天前添加到我的库中。它似乎适用于大多数浏览器,甚至包括 IE6,但 Opera 除外。对于 Opera,您可以使用定期检查而不是卸载事件。
检查相关问题https://github.com/flowersinthesand/portal/issues/21 https://github.com/flowersinthesand/portal/issues/21
###留下一个cookie
- 设置 cookie 以通知存在共享套接字。
- 当套接字关闭时,删除该 cookie 以通知没有共享套接字。
See, https://github.com/flowersinthesand/portal/blob/7c2ce4bb61d05d80580e6cde6c94a78238a67345/jquery.socket.js#L629-L650 https://github.com/flowersinthesand/portal/blob/7c2ce4bb61d05d80580e6cde6c94a78238a67345/jquery.socket.js#L629-L650
###共享和使用共享套接字
- 使用存储事件和 localStorage - 当设置和删除值时,localStorage 会触发存储事件。
- 检查是否支持 StorageEvent 和 localStorage。
- 添加存储事件处理程序,按键过滤事件。我使用套接字的 url 作为键
- 添加套接字的关闭事件,删除存储属性
- 要发出信号,请使用上一个键将数据设置为存储
分享:https://github.com/flowersinthesand/portal/blob/7c2ce4bb61d05d80580e6cde6c94a78238a67345/jquery.socket.js#L531-L568 https://github.com/flowersinthesand/portal/blob/7c2ce4bb61d05d80580e6cde6c94a78238a67345/jquery.socket.js#L531-L568
使用共享:https://github.com/flowersinthesand/portal/blob/7c2ce4bb61d05d80580e6cde6c94a78238a67345/jquery.socket.js#L851-L893 https://github.com/flowersinthesand/portal/blob/7c2ce4bb61d05d80580e6cde6c94a78238a67345/jquery.socket.js#L851-L893
- 使用 window.open 方法 - 如果我们知道共享窗口的名称,我们就可以获得该窗口的引用并访问其属性。
- 每个浏览器都支持 window.open 方法,但某些浏览器(例如 Chrome)禁止访问返回的窗口的属性。
- 获取或创建 name 属性为 key 的 iframe。我使用了套接字的 url,但请注意 IE 不允许在 iframe 标记的 name 属性中使用非单词字符。
- Iframe 的 contentWindow 是共享窗口引用。设置回调变量来存储每个窗口的侦听器。
- 要发出信号,只需使用数据调用回调即可。请注意,IE 8 及更低版本允许仅将字符串传递给其他窗口的函数,并且共享窗口可能会被破坏。
分享:https://github.com/flowersinthesand/portal/blob/7c2ce4bb61d05d80580e6cde6c94a78238a67345/jquery.socket.js#L571-L605 https://github.com/flowersinthesand/portal/blob/7c2ce4bb61d05d80580e6cde6c94a78238a67345/jquery.socket.js#L571-L605
使用共享:https://github.com/flowersinthesand/portal/blob/7c2ce4bb61d05d80580e6cde6c94a78238a67345/jquery.socket.js#L894-L929 https://github.com/flowersinthesand/portal/blob/7c2ce4bb61d05d80580e6cde6c94a78238a67345/jquery.socket.js#L894-L929
Note
- 在上述实现中,信令是广播,因此数据应该指示目标。我使用目标属性,p 代表父级,c 代表子级。
- 我使用附加变量来共享套接字:opened - 共享套接字是否打开,children - 共享者列表。代码和注释将帮助您理解细节。
我希望我的回答有帮助。