MessageEvent

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

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

MessageEvent 接口代表一个目标对象接收到的消息。

这用于表示以下情况中的消息:

由此事件触发的操作是在设置为相关 message 事件的处理程序的函数中定义的。

Event MessageEvent

构造函数

MessageEvent()

创建一个新的 MessageEvent

实例属性

此接口还继承了其父级 Event 的属性。

MessageEvent.data 只读

由消息发送者发送的数据。

MessageEvent.origin 只读

一个字符串,表示消息发送者的源。

MessageEvent.lastEventId 只读

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

MessageEvent.source 只读

一个 MessageEventSource(可以是 WindowProxyMessagePortServiceWorker 对象),表示消息发送者。

MessageEvent.ports 只读

一个 MessagePort 对象数组,其中包含随消息发送的所有 MessagePort 对象,按顺序排列。

实例方法

此接口还继承了其父接口 Event 的方法。

initMessageEvent() 已弃用

初始化一个消息事件。不要再使用此方法请改用 MessageEvent() 构造函数。

示例

在我们的 基本共享工作线程示例运行共享工作线程)中,我们有两个 HTML 页面,每个页面都使用一些 JavaScript 来执行计算。不同的脚本使用同一个工作线程文件来执行计算 — 它们都可以访问它,即使它们的页面运行在不同的窗口中。

以下代码片段展示了使用 SharedWorker() 构造函数创建 SharedWorker 对象。两个脚本都包含此内容。

js
const myWorker = new SharedWorker("worker.js");

然后,两个脚本通过使用 SharedWorker.port 属性创建的 MessagePort 对象访问工作线程。如果使用 addEventListener 附加 onmessage 事件,则端口会通过其 start() 方法手动启动。

js
myWorker.port.start();

当端口启动时,两个脚本分别使用 port.postMessage()port.onmessage 向工作线程发送消息并处理从工作线程发送过来的消息。

js
[first, second].forEach((input) => {
  input.onchange = () => {
    myWorker.port.postMessage([first.value, second.value]);
    console.log("Message posted to worker");
  };
});

myWorker.port.onmessage = (e) => {
  result1.textContent = e.data;
  console.log("Message received from worker");
};

在工作线程内部,我们使用 onconnect 处理程序连接到上面讨论的同一个端口。与该工作线程关联的端口可以在 connect 事件的 ports 属性中访问 — 然后我们使用 MessagePortstart() 方法来启动端口,并使用 onmessage 处理程序来处理从主线程发送过来的消息。

js
onconnect = (e) => {
  const port = e.ports[0];

  port.addEventListener("message", (e) => {
    const workerResult = `Result: ${e.data[0] * e.data[1]}`;
    port.postMessage(workerResult);
  });

  port.start(); // Required when using addEventListener. Otherwise called implicitly by onmessage setter.
};

规范

规范
HTML
# the-messageevent-interface

浏览器兼容性

另见