使用JavaScript向所有打开的窗口/选项卡发送消息

Kev*_*Kev 22 javascript html5 cross-window-scripting

我听说HTML5有window.postMessage(),但似乎需要在窗口(或选项卡,整个问题)上有一个句柄,你要发布消息.如果我要向所有打开的窗口广播怎么办?这可能吗?

(我想要做的就是警告其他的窗口,没有任何服务器往返当用户做一些事情在影响别人一个窗口,使他们能够更新他们的内容.然而,虽然一些窗口可能从现有的开放--allowing我拦截和存储引用他们 - 一些新鲜的窗口可以由用户手动打开,然后选择书签或URL输入在这种情况下,似乎没有被拦截的方式和存储引用.)

bri*_*vis 26

我写了一个库来做这件事:intercom.js(出于你提出的相同原因).

我们目前正在使用它向所有窗口广播通知,因此只有一个窗口需要维护到服务器的套接字连接.正如其他人所建议的那样,它使用localStorage API.

用法非常简单:

var intercom = Intercom.getInstance();

$('a').on('click', function() {
     intercom.emit('notice', {message: 'Something just happened!');
});
Run Code Online (Sandbox Code Playgroud)

要抓住信息,

intercom.on('notice', function(notice) {
    console.log(notice.message);
});
Run Code Online (Sandbox Code Playgroud)

该接口旨在模仿socket.io.


Raf*_*ael 19

IMO使用postMessage是不可能的.使用sessionStorage localStorage怎么样?写入它应该生成一个存储事件,该事件应该传播到共享同一会话存储的所有窗口.

  • cookie也可以是一种解决方案,但存储的优势在于它在对其执行操作时会生成事件.使用cookie时,您必须每隔X秒(setInterval)检查一次新cookie,另一个问题是何时删除cookie. (3认同)
  • 不,这不是一个bug.根据规范,每个文档都有自己的sessionStorage对象,只有localStorage对象在同一个源的所有文档上共享.因此,正在观察窗口B的sessionStorage的侦听器将听不到由Window A的sessionStorage触发的存储事件. (3认同)

Wof*_*Wca 2

假设您不需要向其他网站(仅是您自己的网站)广播消息,BroadcastChannel就是为此目的而设计的。

const channel = new BroadcastChannel('myChannel');
channel.postMessage('myMessage');
channel.addEventListener('message', m => {
    console.log('Received message from other document', m);
});
Run Code Online (Sandbox Code Playgroud)