MessagePort: messageerror 事件

Baseline 已广泛支持

此功能已成熟,并可在许多设备和浏览器版本上运行。自 2023 年 3 月以来,它已在各种浏览器中可用。

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

messageerror 事件在 MessagePort 对象上触发时,表示该对象接收到一个无法反序列化的消息。

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

语法

在诸如 addEventListener() 之类的方法中使用事件名称,或设置事件处理程序属性。

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

onmessageerror = (event) => { }

事件类型

一个 MessageEvent。继承自 Event

Event MessageEvent

事件属性

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

MessageEvent.data 只读

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

MessageEvent.origin 只读

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

MessageEvent.lastEventId 只读

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

MessageEvent.source 只读

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

MessageEvent.ports 只读

一个包含与消息一起发送的、按顺序排列的所有 MessagePort 对象的数组。

示例

尝试共享内存

messageerror 事件的一个常见原因是在 代理集群 之间尝试发送 SharedArrayBuffer 对象或由其支持的缓冲区视图。例如,一个窗口与它创建的共享工作线程不在同一个代理集群中,因此假设页面运行以下代码:

js
const worker = new SharedWorker("worker.js");
worker.port.start();
worker.port.addEventListener("message", (event) => {
  worker.port.postMessage(new SharedArrayBuffer(1024));
});

worker.js 包含以下代码:

js
self.addEventListener("connect", (event) => {
  console.log("Hello");
  const port = event.ports[0];
  port.start();
  port.postMessage("Port connected");
  port.addEventListener("messageerror", (event) => {
    console.log("Message error");
  });
});

那么当共享工作线程尝试反序列化从窗口发送的消息时,就会收到一个 messageerror 事件。

注意: 您可以使用浏览器开发者工具来调试您的 SharedWorker。通过在浏览器地址栏中输入一个 URL 来访问开发者工具的工作线程检查器;例如,在 Chrome 中,URL 是 chrome://inspect/#workers,在 Firefox 中,URL 是 about:debugging#workers

规范

规范
HTML
# event-messageerror
HTML
# handler-messageport-onmessageerror

浏览器兼容性

另见