BroadcastChannel: messageerror 事件

Baseline 已广泛支持

此特性已经十分成熟,可在许多设备和浏览器版本上使用。自 2022 年 3 月起,它已在各浏览器中可用。

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

当通道上收到一条无法反序列化的消息时,会触发 BroadcastChannel 接口的 messageerror 事件。

语法

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

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

onmessageerror = (event) => { }

事件类型

一个 MessageEvent。继承自 Event

Event MessageEvent

事件属性

除了下面列出的属性之外,父接口 Event 的属性也可使用。

data 只读

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

origin 只读

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

lastEventId 只读

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

source 只读

一个消息事件源,它可以是 WindowProxyMessagePortServiceWorker 对象,代表消息的发送者。

ports 只读

一个 MessagePort 对象数组,表示消息发送通道(如果适用,例如在通道消息传递或向共享工作者发送消息时)关联的端口。

示例

监听 messageerror 事件

此代码使用 addEventListener() 来监听消息和错误

js
const channel = new BroadcastChannel("example-channel");

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

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

同样,但使用 onmessageonmessageerror 事件处理程序属性

js
const channel = new BroadcastChannel("example-channel");

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

channel.onmessageerror = (event) => {
  console.log(event);
};

尝试共享内存

messageerror 事件的一个常见原因是尝试在代理集群(agent clusters)之间发送 SharedArrayBuffer 对象,或由其支持的缓冲区视图。以下代码演示了这一点。

页面 A 运行以下代码

js
const channel = new BroadcastChannel("hello");
channel.postMessage({ data: new SharedArrayBuffer(1024) });

页面 B 运行以下代码

js
const channel = new BroadcastChannel("hello");
channel.addEventListener("messageerror", (event) => {
  console.error("Message error");
});

然后,当页面 B 尝试反序列化从页面 A 发送的消息时,它将收到一个 messageerror 事件。

规范

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

浏览器兼容性

另见