ServiceWorkerContainer:message 事件

Baseline 已广泛支持

此功能已成熟,可跨多种设备和浏览器版本工作。它自 ⁨2018 年 4 月⁩ 起已在所有浏览器中可用。

安全上下文: 此功能仅在安全上下文(HTTPS)中可用,且支持此功能的浏览器数量有限。

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

message 事件用于由 service worker 控制的页面接收来自 service worker 的消息。

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

语法

在诸如 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 对象数组,表示消息发送通道(如果适用,例如在通道消息传递或向共享工作者发送消息时)关联的端口。

示例

在此示例中,service worker 从 fetch 事件中获取客户端 ID,然后使用 Client.postMessage 向其发送消息。

js
// service-worker.js
async function messageClient(clientId) {
  const client = await clients.get(clientId);
  client.postMessage("Hi client!");
}

addEventListener("fetch", (event) => {
  messageClient(event.clientId);
  event.respondWith(() => {
    // …
  });
});

客户端可以通过监听 message 事件来接收消息。

js
// main.js
navigator.serviceWorker.addEventListener("message", (message) => {
  console.log(message);
});

或者,客户端也可以使用 onmessage 事件处理程序来接收消息。

js
// main.js
navigator.serviceWorker.onmessage = (message) => {
  console.log(message);
};

规范

规范
Service Workers
# dom-serviceworkercontainer-onmessage

浏览器兼容性

另见