--- title: MessagePort slug: Web/API/MessagePort tags: - API - Channel messaging - HTML5 - Interface - MessagePort - Reference - TopicStub translation_of: Web/API/MessagePort ---
{{APIRef("HTML DOM")}}
Channel Messaging API 的 MessagePort
接口代表 {{domxref("MessageChannel")}} 的两个端口之一, 它可以让你从一个端口发送消息,并在消息到达的另一个端口监听它们。
{{AvailableInWorkers}}
继承自父类 {{domxref("EventTarget")}} 的方法
继承自父类 {{domxref("EventTarget")}} 的事件回调
message
的 {{domxref("MessageEvent")}} 在该端口触发时,它将会被调用──也就是说,该端口收到了一条消息。MessagePort
对象收到消息时会触发。MessagePort
对象收到无法被反序列化的消息时触发。在下面的例子中,你可以看到一个使用 {{domxref("MessageChannel.MessageChannel","MessageChannel()")}} 构造函数创建出的新 channel.
当 IFrame 加载完成后,我们给 {{domxref("MessageChannel.port1")}} 注册了一个 {{domxref("MessagePort.onmessage","onmessage")}} 回调,并且使用 {{domxref("window.postMessage")}} 方法把 {{domxref("MessageChannel.port2")}} 和一条消息一起传给 IFrame.
当从 IFrame 收到消息时,onMessage
方法会把消息输出到一个段落里。
var channel = new MessageChannel(); var output = document.querySelector('.output'); var iframe = document.querySelector('iframe'); // 等待 iframe 加载 iframe.addEventListener("load", onLoad); function onLoad() { // 监听 port1 的事件 channel.port1.onmessage = onMessage; // 把 port2 传给 iframe iframe.contentWindow.postMessage('Hello from the main page!', '*', [channel.port2]); } // 处理 port1 收到的消息 function onMessage(e) { output.innerHTML = e.data; }
要查看可运行的完整示例,参考我们在 Github 上的 channel messaging basic demo (也可以在线运行).
Specification | Status | Comment |
---|---|---|
{{SpecName('HTML WHATWG', '#message-ports','MessagePort')}} | {{Spec2('HTML WHATWG')}} | No difference from {{SpecName("HTML5 Web Messaging")}}. |
{{SpecName('HTML5 Web Messaging', '#message-ports','MessagePort')}} | {{Spec2('HTML5 Web Messaging')}} | W3C version of the spec |
{{Compat("api.MessagePort")}}