javascript - 跨浏览器选项卡共享 websocket?

标签 javascript html node.js websocket web-worker

我们希望每个浏览器有一个套接字,而不是浏览器中的每个选项卡一个。我们怎样才能实现它?我读到了很有希望的共享网络 worker 。对此的引用也值得赞赏。不幸的是,据我所知,Mozilla 或 Internet Explorer 尚未实现共享网络 worker 。那么在这种情况下该怎么办呢?我们正在服务器端开发 node.js。

最佳答案

看到这个问题后,我终于实现了共享套接字,并在几天前添加到我的库中。它似乎适用于大多数浏览器,甚至包括 IE6,但 Opera 除外。对于 Opera,您可以使用常规检查而不是卸载事件。

https://github.com/flowersinthesand/portal/issues/21 上查看相关问题

###留下一个cookie

  1. 设置 cookie 以通知存在共享套接字。
  2. 当套接字关闭时,删除该 cookie 以通知没有共享套接字。

见,https://github.com/flowersinthesand/portal/blob/7c2ce4bb61d05d80580e6cde6c94a78238a67345/jquery.socket.js#L629-L650

###共享和使用共享套接字

  1. 使用存储事件和 localStorage - localStorage 在设置和删除值时触发存储事件。
  2. 检查是否支持 StorageEvent 和 localStorage。
  3. 添加按键过滤事件的存储事件处理程序。我用socket的url作为key
  4. 增加socket的关闭事件,移除存储属性
  5. 要发出信号,请使用前一个键将数据设置为存储

分享:https://github.com/flowersinthesand/portal/blob/7c2ce4bb61d05d80580e6cde6c94a78238a67345/jquery.socket.js#L531-L568

使用共享:https://github.com/flowersinthesand/portal/blob/7c2ce4bb61d05d80580e6cde6c94a78238a67345/jquery.socket.js#L851-L893

  1. 使用 window.open 方法 - 如果我们知道共享窗口的名称,我们可以获取该窗口的引用并访问其属性。
  2. 每个浏览器都支持 window.open 方法,但某些浏览器(例如 Chrome)禁止访问返回的窗口的属性。
  3. 获取或创建以 name 属性为 key 的 iframe。我使用了socket的url,但是注意IE不允许在iframe标签的name属性中使用非单词字符。
  4. Iframe 的 contentWindow 是一个共享窗口引用。设置回调变量来存储每个窗口的监听器。
  5. 要发出信号,只需使用数据调用回调即可。请注意,IE 8 及更低版本只允许将字符串传递给其他窗口的函数,并且共享窗口可能会被破坏。

分享:https://github.com/flowersinthesand/portal/blob/7c2ce4bb61d05d80580e6cde6c94a78238a67345/jquery.socket.js#L571-L605

使用共享:https://github.com/flowersinthesand/portal/blob/7c2ce4bb61d05d80580e6cde6c94a78238a67345/jquery.socket.js#L894-L929

注意

  1. 在上面的实现中,信令是广播,所以数据应该指明目标。我使用了目标属性,p 代表父项,c 代表子项。
  2. 我使用了附加变量来共享套接字:opened - 共享套接字是否打开,children - 共享者列表。代码和注释将帮助您了解详细信息。

希望我的回答对你有帮助。

关于javascript - 跨浏览器选项卡共享 websocket?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9554896/

相关文章:

javascript - 自动 Firefox 单击出现的按钮

javascript - 如何在没有jquery的情况下按属性选择项目?

javascript - Nvd3 : How prevent to display chart between -1 and 1 if have all y values 0?

node.js - 启动前从文件夹中读取文件

javascript - 在 Node.js 中同步运行函数

javascript - 我应该使用字符串或属性名称初始化对象吗?或者这有什么关系吗?

css - 当滚动并将我的导航栏固定在顶部时,它有一个不稳定的运动效果

javascript - 从下拉列表中选择 javascript 事件

javascript - 使用 SlideToggle 按钮显示/隐藏信息

node.js - 这段代码是异步执行的吗?