使用 MessageChannel 和不使用 MessageChannel 的网络消息有什么区别?

mtk*_*nko 4 html javascript

使用 html5 我可以这样做:

document.getElementById('someIframe').contentWindow.postMessage('hi', 'someDomain');
Run Code Online (Sandbox Code Playgroud)

或者我可以使用 MessageChannel:

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

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

pla*_*alx 5

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

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