MessagePort: message 事件

Baseline 已廣泛支援

此特性已相當成熟,可在許多裝置和瀏覽器版本上使用。自 2015 年 9 月以來,該特性已在各大瀏覽器中可用。

注意:此功能在 Web Workers 中可用。

當訊息到達 MessagePort 物件上時,會在此物件上觸發 message 事件。

此事件不可取消,也不會冒泡。

語法

在諸如 addEventListener() 之類的方法中使用事件名稱,或設定事件處理程式屬性。

js
addEventListener("message", (event) => { })

onmessage = (event) => { }

事件型別

一個 MessageEvent。繼承自 Event

Event MessageEvent

事件屬性

此介面還繼承了其父級 Event 的屬性。

MessageEvent.data 只讀

由訊息傳送者傳送的資料。

MessageEvent.origin 只讀

一個字串,表示訊息傳送者的源。

MessageEvent.lastEventId 只讀

一個字串,表示事件的唯一 ID。

MessageEvent.source 只讀

一個 MessageEventSource(可以是 WindowProxyMessagePortServiceWorker 物件),表示訊息傳送者。

MessageEvent.ports 只讀

一個包含所有隨訊息傳送的 MessagePort 物件的陣列,按順序排列。

示例

假設一個指令碼建立了一個 MessageChannel,並使用類似如下的程式碼將其一個埠傳送到另一個瀏覽上下文,例如另一個 <iframe>

js
const channel = new MessageChannel();
const myPort = channel.port1;
const targetFrame = window.top.frames[1];
const targetOrigin = "https://example.org";

const messageControl = document.querySelector("#message");
const channelMessageButton = document.querySelector("#channel-message");

channelMessageButton.addEventListener("click", () => {
  myPort.postMessage(messageControl.value);
});

targetFrame.postMessage("init", targetOrigin, [channel.port2]);

目標可以使用類似如下的程式碼接收該埠,並開始監聽其上的訊息和訊息錯誤:

js
window.addEventListener("message", (event) => {
  const myPort = event.ports[0];

  myPort.addEventListener("message", (event) => {
    received.textContent = event.data;
  });

  myPort.addEventListener("messageerror", (event) => {
    console.error(event.data);
  });

  myPort.start();
});

請注意,偵聽器必須在任何訊息傳遞到該埠之前呼叫 MessagePort.start()。僅在使用 addEventListener() 方法時才需要此操作:如果接收方使用 onmessage 代替,則會自動呼叫 start()

js
window.addEventListener("message", (event) => {
  const myPort = event.ports[0];

  myPort.onmessage = (event) => {
    received.textContent = event.data;
  };

  myPort.onmessageerror = (event) => {
    console.error(event.data);
  };
});

規範

規範
HTML
# event-message
HTML
# handler-messageport-onmessage

瀏覽器相容性

另見