我正在寻找一种方法,如何在浏览器中的多个选项卡或窗口之间进行通信(在同一个域上,而不是CORS),而不留痕迹.有几个解决方案:
第一个可能是最糟糕的解决方案 - 你需要从当前窗口打开一个窗口,然后只要你打开窗户就可以进行通信.如果您在任何窗口中重新加载页面,则很可能会丢失通信.
第二种方法,使用postMessage,可能启用跨源通信,但遇到与第一种方法相同的问题.您需要维护一个窗口对象.
第三种方式,使用cookie,在浏览器中存储一些数据,这可以有效地看起来像向同一域上的所有窗口发送消息,但问题是你永远不知道所有标签是否已经读过"消息"打扫干净.您必须实现某种超时以定期读取cookie.此外,您受限于最大cookie长度,即4KB.
使用localStorage的第四种解决方案似乎克服了cookie的限制,甚至可以使用事件进行监听.接受的答案中描述了如何使用它.
编辑2018:接受的答案仍然有效,但现代浏览器有一个更新的解决方案,使用BroadcastChannel.有关如何使用BroadcastChannel在选项卡之间轻松传输消息的简单示例,请参阅其他答案.
我听说HTML5有window.postMessage()
,但似乎需要在窗口(或选项卡,整个问题)上有一个句柄,你要发布消息.如果我要向所有打开的窗口广播怎么办?这可能吗?
(我想要做的就是警告其他的窗口,没有任何服务器往返当用户做一些事情在影响别人一个窗口,使他们能够更新他们的内容.然而,虽然一些窗口可能从现有的开放--allowing我拦截和存储引用他们 - 一些新鲜的窗口可以由用户手动打开,然后选择书签或URL输入在这种情况下,似乎没有被拦截的方式和存储引用.)