【发布时间】:2013-04-13 20:46:15
【问题描述】:
查看此文档中的 postMessage 示例:http://developer.chrome.com/trunk/apps/app_external.html#postMessage
似乎表明沙盒页面将同步注册事件处理程序,否则它应该如何获取 postMessage 事件?
我想这与这里的错误有关:https://code.google.com/p/chromium/issues/detail?id=154662 似乎您不能使用窗口回调将 postMessage 发送到沙盒 iframe,但是提到了一种解决方法,您可以在沙盒页面中使用包含 iframe 的页面。这里唯一的问题是尚不清楚事件如何/何时触发以及它在哪里可见......
这个沙盒的东西看起来非常复杂,并且它周围的文档具有误导性和/或过时。这个例子有意义吗?是否可以在不先获取消息并记录 event.source 的情况下向后台页面发送消息?
如何在后台页面中注册事件侦听器以响应从沙盒页面发回的消息?这里有这么多问题,而我所拥有的只是一个破碎的例子。
【问题讨论】:
-
玩了一段时间后,这似乎奏效了:
setTimeout(function() { win.contentWindow.frames[0].postMessage('I just called... to say... hi.', '*'); }, 100);但是需要超时来执行此操作似乎很疯狂。 -
我无法回答您的问题,因为它的措辞。但你是对的:这个例子有点过于油嘴滑舌了。这在技术上是正确的,因为它确实“将消息发布到它打开的沙盒页面”。这不是一个非常有用的例子,因为它不可靠。请注意 WHATWG 规范的建议“如果要将消息发送到新创建的子 iframe 的窗口,建议作者让子文档向其父级发布一条消息,宣布他们已准备好接收消息,并让父级等待在开始发布消息之前为这条消息。”
-
我已经完成了。不幸的是,答案并不简洁,但它完成了工作,并且确实按照我猜想的方式工作。今天晚些时候我会在这里回答我自己的问题。