2012-03-14 82 views
4

规范说,我应该能够在窗口对象上使用postMessage()。 Mozilla says,我应该可以在open()的窗口上做到这一点。HTML5是否支持跨窗口消息?

但是,我已经采取了罗伯特尼曼的postMessage示例,并试图使其工作across windows。但是,IE10和Chrome都不能为新打开的窗口提供postMessage函数。

var target = … // original declaration 
popoutbutton.onclick = function(evt) { 
    realWin = window.open(iframeWin.frameElement.src, "window1", "width=600,height=400,status=yes,scrollbars=no,resizable=yes"); 
    target = realWin; 
    target.focus(); 
}; 

// …snip… 

target.postMessage(myMessage.value, expectorigin); // <-- fails because target.postMessage() is undefined 

我是否错过了某些东西,或者这个功能根本不存在吗?

- 更新如下 -

的开发者预览版只是似乎并没有做到这一点。我再次尝试与消费者预览。 IE10(build 8250)像预期的那样。谢谢你的帮助!

+1

你举的例子在这里工作在Opera – Andre 2012-03-14 14:21:11

+0

您正在使用哪个版本的Opera?弹出窗口在我的安装版本11.61上不起作用。 – 2012-03-14 14:45:04

+1

你能为我们创建一个小的JSFiddle演示程序吗? – Domenic 2012-03-14 15:05:19

回答

0

我可以让它在Chrome 15.0.874.121工作,尽管你的样品中,你在呼唤target.postMessage你已经打开了窗口前,虽然你已跳过任何代码最初设定target

在新窗口中的内容加载之前(或至少加载足够的事件监听器来连接),您可能还会遇到调用postMessage的问题。所以当没有任何事情真的在听时,事件就会被解雇。您可能需要在此场景中添加等待以确保新加载的窗口已加载。

在Internet Explorer 10中,我收到错误SCRIPT16388:每当我尝试脚本时都会中止操作 - 即使我等待10秒钟。

+0

以前。现在它在Opera,我怎么之前错过?验证和Chrome的工作了。 – 2012-03-14 20:37:03

+0

我发现这个IE10的bug太多,当打开的窗口中试图调用父和这个人会做它发生postMessage。解决这个问题的技巧是将postMessage包装在一个setTimeout 0ms中,我会跟进Internet Explorer,看看为什么会发生这种情况。 – jsgoupil 2012-12-07 21:17:35

1

有比postMessage的更好的方法,请参阅本:

http://carlosaguayo.posterous.com/html5-localstorage-events-cross-window-messag

+0

这是个好主意。然而,我不相信这实际上比直接发送消息更好。 – 2012-04-24 22:08:22

+1

因为您不需要保留对窗口的引用,所以更好。假设用户由于某种原因刷新窗口,弹出窗口或父窗口,那么引用就消失了,所有的逻辑都会中断。使用localStorage,你不需要跟踪弹出窗口。 – 2012-07-28 03:59:15

+0

跨窗口广播模式打开了令人头痛的世界。想象一下,聆听“添加联系人”消息。现在想象你有两个标签打开到同一页面。除非你管理竞争条件,哪个标签是“主人”,否则你会得到重复的增加。另外:朋友不要让朋友使用Pop-Ups。 – 2013-06-17 19:19:45