JavaScript的; 与相同来源的选项卡/窗口之间通信[复制] JavaScript的;

2019-05-09 01:54发布

这个问题已经在这里有一个答案:

  • 标签或窗口之间的通信 9回答

我有两个窗口:窗口A和窗口B.

  • 窗口A和窗口B具有相同的域
  • 窗口A和窗口B没有任何父窗口。

问题:

  1. 是否有可能在窗口中的获取窗口B的参考?
  2. 什么是最优雅的方式,使窗口中的通知事窗口B'
    (包括新的HTML5规格)

两种方式我是知道这样做的:

  • 消息通过服务器:其中橱窗内regulary询问窗口A已通知一些服务器
  • 由本地数据(HTML5)消息:当窗口A想通知它的东西改变了本地数据,橱窗内regulary检查本地数据进行任何更改。

但这两种方式都没有那么优雅。
例如,它会很高兴地拿到窗口B的参考和使用window.postMessage()(HTML5)

最终目标是使一些像Facebook这样的:如果你打开4个的Facebook选项卡,并在一个标签聊天,聊天是最新的在每一个Facebook标签,这是整齐!

Answer 1:

我坚持使用问题中提到的共享本地数据解决方案localStorage 。 这似乎是在可靠性,性能和浏览器兼容性的最佳解决方案。

localStorage是在所有的现代浏览器中实现。

storage其他标签页,使事件触发改变localStorage 。 这是沟通的目的很方便。

参考可以在这里找到:
Webstorage
Webstorage -存储事件



Answer 2:

该广播信标准允许这样做。 现在它在Firefox和Chrome(实施caniuse , MDN ):

// tab 1
var ch = new BroadcastChannel('test');
ch.postMessage('some data');

// tab 2
var ch = new BroadcastChannel('test');
ch.addEventListener('message', function (e) {
    console.log('Message:', e.data);
});


Answer 3:

SharedWorker是WHATWG / HTML5规范对可选项卡之间进行通信的公共过程。



Answer 4:

你说你的:

utlimate目标是让地方,如果你打开4个的Facebook标签的东西,如Facebook,并在一个标签聊天,聊天是每一个具体化Facebook标签上,至极整齐!

这应该发生,因为你的设计的一个副产品,查询更新模型(可能是服务器)聊天,而不是你有在交叉视角通信设计的意见。 除非你处理传输大量的数据,为什么要担心呢? 现在看来似乎会没有一个巨大的增益的事情复杂化。

几年前,我发现,如果我window.open使用现有窗口的名称和空白URL,我到了现有的窗口的引用(这种行为甚至在案MDC和评论MSDN文档表明,它在工作IE以及)。 但是,这是几年前,我不知道它的支持是多么普遍的是在今天的世界,当然,你不会有一个窗口的名称查找,除非所有的窗口包括一个名为iframe沟通,唯一命名通过服务器端的代码,然后由服务器端代码信号传送到其他窗口......(可怕的想法:这实际上可能是可行的存储与“当前”窗口名称的登录帐户在表,给列表中创建任何新的窗口,登录到该帐户,剔除旧的非活动条目,但如果该列表是略显过时,你会为别人搜索时打开新窗口......我敢打赌,支持从前途未卜浏览器到浏览器)。



Answer 5:

除了即将到来的SharedWorker ,您还可以使用跨文档的消息 ,这是更为广泛的支持 。 在这种情况下,必须有一个是负责与打开所有其他窗口一个主窗口window.open 。 然后,子窗口可以使用的postMessage他们window.opener

如果使用闪光灯是一个选择,还有更老的LocalConnection几乎支持闪光灯安装(任何客户端上的示例代码 )。

其他后备方法:
postMessage的jQuery插件与旧版本浏览器window.location.href回落
非即时通讯基于cookie的解决方案



Answer 6:

据我所知,这是不可能的,如果他们不具有相同的父跨Windows通信。

如果他们都被从父窗口中打开,你应该能够得到父母的变量引用的保持。

在父,开这样的窗口:

childA = window.open(...);
childB = window.open(...)

在ChildA,访问childB是这样的:

childB = window.opener.childA


Answer 7:

我有一个整洁的方式做这样的伎俩,但有条件限制的:你应该让你的域的弹出窗口,你会得到一个页面总是打开(如标签或弹出式)将实施窗口之间的通信。

下面是一个例子: http://test.gwpanel.org/test/page_one.html (启用域弹出窗口后刷新页面)

这一招的主要特征 - 弹出正在与网址片段“#”到了最后,这股力量的浏览器不改变窗口的位置和存储的所有数据打开。 而window.postMessage做休息。



文章来源: Javascript; communication between tabs/windows with same origin [duplicate]