我有两个窗口:窗口A和窗口B.
- 窗口A和窗口B具有相同的域
- 窗口A和窗口B没有任何父窗口。
问题:
- 是否有可能在窗口中的获取窗口B的参考?
- 什么是最优雅的方式,使窗口中的通知事窗口B'
(包括新的HTML5规格)
两种方式我是知道这样做的:
- 消息通过服务器:其中橱窗内regulary询问窗口A已通知一些服务器
- 由本地数据(HTML5)消息:当窗口A想通知它的东西改变了本地数据,橱窗内regulary检查本地数据进行任何更改。
但这两种方式都没有那么优雅。
例如,它会很高兴地拿到窗口B的参考和使用window.postMessage()(HTML5)
最终目标是使一些像Facebook这样的:如果你打开4个的Facebook选项卡,并在一个标签聊天,聊天是最新的在每一个Facebook标签,这是整齐!
我坚持使用问题中提到的共享本地数据解决方案localStorage
。 这似乎是在可靠性,性能和浏览器兼容性的最佳解决方案。
localStorage
是在所有的现代浏览器中实现。
将storage
在其他标签页,使事件触发改变localStorage
。 这是沟通的目的很方便。
参考可以在这里找到:
Webstorage
Webstorage -存储事件
该广播信标准允许这样做。 现在它在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);
});
SharedWorker是WHATWG / HTML5规范对可选项卡之间进行通信的公共过程。
你说你的:
utlimate目标是让地方,如果你打开4个的Facebook标签的东西,如Facebook,并在一个标签聊天,聊天是每一个具体化Facebook标签上,至极整齐!
这应该发生,因为你的设计的一个副产品,查询更新模型(可能是服务器)聊天,而不是你有在交叉视角通信设计的意见。 除非你处理传输大量的数据,为什么要担心呢? 现在看来似乎会没有一个巨大的增益的事情复杂化。
几年前,我发现,如果我window.open
使用现有窗口的名称和空白URL,我到了现有的窗口的引用(这种行为甚至在案MDC和评论MSDN文档表明,它在工作IE以及)。 但是,这是几年前,我不知道它的支持是多么普遍的是在今天的世界,当然,你不会有一个窗口的名称查找,除非所有的窗口包括一个名为iframe
沟通,唯一命名通过服务器端的代码,然后由服务器端代码信号传送到其他窗口......(可怕的想法:这实际上可能是可行的存储与“当前”窗口名称的登录帐户在表,给列表中创建任何新的窗口,登录到该帐户,剔除旧的非活动条目,但如果该列表是略显过时,你会为别人搜索时打开新窗口......我敢打赌,支持从前途未卜浏览器到浏览器)。
除了即将到来的SharedWorker ,您还可以使用跨文档的消息 ,这是更为广泛的支持 。 在这种情况下,必须有一个是负责与打开所有其他窗口一个主窗口window.open
。 然后,子窗口可以使用的postMessage他们window.opener
。
如果使用闪光灯是一个选择,还有更老的LocalConnection几乎支持闪光灯安装(任何客户端上的示例代码 )。
其他后备方法:
postMessage的jQuery插件与旧版本浏览器window.location.href回落
非即时通讯基于cookie的解决方案
据我所知,这是不可能的,如果他们不具有相同的父跨Windows通信。
如果他们都被从父窗口中打开,你应该能够得到父母的变量引用的保持。
在父,开这样的窗口:
childA = window.open(...);
childB = window.open(...)
在ChildA,访问childB是这样的:
childB = window.opener.childA
我有一个整洁的方式做这样的伎俩,但有条件限制的:你应该让你的域的弹出窗口,你会得到一个页面总是打开(如标签或弹出式)将实施窗口之间的通信。
下面是一个例子: http://test.gwpanel.org/test/page_one.html (启用域弹出窗口后刷新页面)
这一招的主要特征 - 弹出正在与网址片段“#”到了最后,这股力量的浏览器不改变窗口的位置和存储的所有数据打开。 而window.postMessage做休息。
文章来源: Javascript; communication between tabs/windows with same origin [duplicate]