6

使用 html5 我可以做到这一点:

document.getElementById('someIframe').contentWindow.postMessage('hi', 'someDomain');

或者我可以使用 MessageChannel:

var mc = new MessageChannel();
document.getElementById('someIframe').contentWindow.postMessage('hi', 'someDomain',[mc.port2]);

这两种方式之间的真正区别是什么?什么时候必须使用第一个变体,什么时候必须使用第二个变体?

4

1 回答 1

6

我怀疑我可以比以下更好地解释它,但是重要的一点是,一旦发送了端口,就不需要对后续消息进行来源检查。使用时window.addEventListener('message', ...),您必须在每次收到消息时验证消息源是否可信。

当您创建一个新的 MessageChannel 对象时,它有两个连接的 MessagePort 对象(port1 和 port2)。其中一个端口被发送到另一个窗口或框架,并且可以发送和接收消息,而无需重复使用 window.postMessage 时需要的源检查。 只有在将端口发送到创建它们的窗口以外的窗口时,才需要验证端口和消息的来源。MessagePort 通过两个(并且只有这两个)连接的端口发送和接收消息,从而简化了消息传递过程。使用 postMessage 在端口之间发布消息。由于端口将只接受连接端口之间的消息,因此一旦建立连接就不需要进一步验证. MessageChannel 支持 IFrameElements、跨域窗口或同页通信之间的异步通信。 http://msdn.microsoft.com/en-us/library/windows/apps/hh441303.aspx

于 2013-09-21T15:05:07.013 回答