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

使用JavaScript向所有打开的窗口/选项卡发送消息,javascript,html,cross-window-scripting,Javascript,Html,Cross Window Scripting,我听说HTML5有window.postMessage(),但它似乎需要在您发布消息的窗口(或选项卡)上有一个句柄。如果我想向所有打开的窗口广播怎么办?这可能吗 (我试图做的是,当用户在一个窗口中执行影响其他窗口的操作时,在没有任何服务器往返的情况下向其他窗口发出警告,以便它们可以更新其内容。然而,尽管一些窗口可以从现有窗口打开,允许我截取并存储对它们的引用,但一些新窗口可能会由u然后选择一个书签或键入URL。在这种情况下,似乎没有办法截取和存储引用。)在我看来,使用postMessage是不可

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


(我试图做的是,当用户在一个窗口中执行影响其他窗口的操作时,在没有任何服务器往返的情况下向其他窗口发出警告,以便它们可以更新其内容。然而,尽管一些窗口可以从现有窗口打开,允许我截取并存储对它们的引用,但一些新窗口可能会由u然后选择一个书签或键入URL。在这种情况下,似乎没有办法截取和存储引用。)在我看来,使用postMessage是不可能的。使用sessionStoragelocalStorage如何?写入它将生成一个存储事件,该事件应传播到共享同一会话存储的所有窗口。我编写了一个库来执行此操作:(出于与您概述的相同原因)

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

用法非常简单:

var intercom = Intercom.getInstance();

$('a').on('click', function() {
     intercom.emit('notice', {message: 'Something just happened!');
});
为了抓住信息

intercom.on('notice', function(notice) {
    console.log(notice.message);
});

该接口旨在模拟。

或Cookie(只要它们在同一个域中)Cookie也可以是一种解决方案,但存储的优点是,它在对其执行操作时会生成事件。使用Cookie时,您必须每X秒检查一次(设置间隔)对于新cookie,另一个问题是何时删除cookie。我不知道会话事件——MDC的sessionStorage文档有点混乱。感谢您的指导!问题是,正如我正确理解规范()一样,在这两种情况下(sessionStorage和localStorage)都应该触发事件。如果Firefox没有触发该事件,我认为这是一个错误。不,这不是一个错误。根据规范,每个文档都有自己的sessionStorage对象,只有localStorage对象在同一来源的所有文档上共享。因此,由窗口a的sessionStorage触发的存储事件不会被观察该事件的侦听器听到窗口B的会话存储。根据您的使用情况,Comet(或其他类似的“HyBi”mecanism)可能是更好的选择;例如,如果您希望通知是跨浏览器的(即,用户已打开IE和Firefox,它会在IE中进行更改,并希望Firefox收到通知)。此外,我不知道所有浏览器的具体工作方式(可能有可配置的选项可以更改其默认行为,例如Firefox的-no remote命令行参数)但是,即使对于同一个浏览器,如果没有Comet风格/服务器驱动的通信,所有windows也可能无法通信。谢谢,但我已经有了服务器端的后备功能…我只是希望尽可能提高效率,让它感觉更快。为什么这个问题被当作一个重复的问题来解决,而它应该重复的那个问题是在6年前出现的s稍后?这看起来很酷。愚蠢的问题,但这在不同的域之间有效吗?我不希望
存储
事件在不同的域中跨窗口工作,因为它们将有自己的
本地存储
。我知道我可以测试它,但我只是想如果你真的想要的话,我应该把它放在同一个域上ted疯狂你可能会疯狂使用iframes和postMessage+Intercom来实现跨域工作。作为共享web workers的后备方案,这会有效吗?我正在尝试设置一个web worker,其数据在选项卡之间共享,与socket.io的绑定不同,只是它与worker通信,而不是一个服务器。如果关闭了带有工作程序的选项卡,则应在另一个选项卡上重新启动。我不明白为什么这不可能:)两个缺点-不适用于脱机Web应用程序,可能会导致高延迟