MessagePort:postMessage() 方法

备注: 此特性在 Web Worker 中可用。

MessagePort 接口的 postMessage() 方法从端口发送一条消息,可以将对象所有权转移给其他浏览上下文。

语法

js
postMessage(message)
postMessage(message, options)
postMessage(message, transfer)

参数

message

需要通过 channel 发送的消息。可以是任何基本数据类型。多个数据项可以作为数组发送。

options 可选

一个可选对象,包含一个带有数组transfer 的字段,数组中包含要转让所有权的可转移对象。这些对象的所有权将转移到接收方,发送方将不能再使用它们。

transfer 可选

一个可选数组,包含要转让所有权的可转移对象。这些对象的所有权将转移到接收方,发送方将不能再使用它们。

返回值

无(undefined)。

示例

在以下代码块中,你可以看到使用 MessageChannel() 构造函数创建了一个新的 channel。当 IFrame 加载完成后,我们使用 window.postMessage 中的 MessageChannel.port2 以及一条消息传递给 IFrame。IFrame 接收消息,并使用 MessageChannel 中的 postMessage() 上发送回上一条消息。

handleMessage 处理程序使用 onmessage 对从 iframe 发回的消息作出响应,并将其放入段落中;MessageChannel.port1 监听了 onmessage 事件,以检查消息何时到达。

js
const channel = new MessageChannel();
const para = document.querySelector("p");

const ifr = document.querySelector("iframe");
const otherWindow = ifr.contentWindow;

ifr.addEventListener("load", iframeLoaded, false);

function iframeLoaded() {
  otherWindow.postMessage("传输信息端口", "*", [channel.port2]);
}

channel.port1.onmessage = handleMessage;
function handleMessage(e) {
  para.innerHTML = e.data;
}

// 在 iframe 中...

window.addEventListener("message", (event) => {
  const messagePort = event.ports?.[0];
  messagePort.postMessage("你好,来自 iframe!");
});

要查看可运行的完整示例,参考我们在 Github 上的 channel messaging 基础演示也可以在线运行)。

规范

Specification
HTML Standard
# dom-messageport-postmessage-dev

浏览器兼容性

BCD tables only load in the browser

参见