【发布时间】:2015-03-29 15:08:37
【问题描述】:
我正在寻找一种方法,如何在浏览器中的多个选项卡或窗口之间进行通信(在同一个域上,而不是 CORS)而不留下任何痕迹。有几种解决方案:
第一个可能是最糟糕的解决方案 - 您需要从当前窗口打开一个窗口,然后您只能在保持窗口打开的情况下进行通信。如果您在任何窗口中重新加载页面,您很可能会失去通信。
第二种方法,使用 postMessage,可能会启用跨域通信,但它遇到与第一种方法相同的问题。您需要维护一个窗口对象。
第三种方式,使用cookie,在浏览器中存储一些数据,这可以有效地看起来像向同一域中的所有窗口发送消息,但问题是你永远无法知道是否所有选项卡都读取了“消息”在清理之前已经或没有。您必须实施某种超时来定期读取 cookie。此外,您还受到最大 cookie 长度的限制,即 4 KB。
第四个方案,使用localStorage,似乎克服了cookies的限制,甚至可以使用事件监听。接受的答案中描述了如何使用它。
在 2018 年,公认的答案仍然有效,但现代浏览器有一个更新的解决方案,即使用 BroadcastChannel。有关如何使用 BroadcastChannel 在选项卡之间轻松传输消息的简单示例,请参见其他答案。
【问题讨论】:
-
当几乎相同的问题多年来一直存在时,为什么这个问题被关闭为“过于宽泛”? Sending a message to all open windows/tabs using JavaScript、stackoverflow.com/questions/2236828/…、How do you communicate between 2 browser tabs/windows? 等等。
-
我在 localStorage 和 sessionStorage 上创建了一个库来管理客户端数据存储。你可以做类似 storageManager.savePermanentData('data', 'key');或 storageManager.saveSyncedSessionData('data', 'key');基于您希望数据的行为方式。它确实简化了过程。全文在这里:ebenmonney.com/blog/…
-
几年前我创建了库sysend.js,在最新版本中它使用了BroadcastChannel。您可以通过打开此页面两次jcubic.pl/sysend.php 来测试该库,如果您提供 iframe 代理,它也可以使用不同的来源。
-
我是否将子域视为同源?我的意思是,我确实有以下三个域,它们是否通过广播通道 api 进行通信? alpha.firstdomain.com、beta.firstdomain.com、gama.firstdomain.com
标签: javascript html browser broadcast-channel