ServiceWorkerGlobalScope:message 事件

Baseline 已广泛支持

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

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

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

ServiceWorkerGlobalScope 接口的 message 事件在收到传入消息时发生。受控页面可以使用 ServiceWorker.postMessage() 方法向 Service Worker 发送消息。Service Worker 可以选择通过 Client.postMessage() 向对应的受控页面发送响应。

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

语法

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

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

onmessage = (event) => { }

事件类型

一个 ExtendableMessageEvent。继承自 ExtendableEvent

Event ExtendableEvent ExtendableMessageEvent

事件属性

继承自其父级 ExtendableEvent 的属性.

ExtendableMessageEvent.data 只读

返回事件的数据。它可以是任何数据类型。如果分发在 messageerror 事件中,则该属性将为 null

ExtendableMessageEvent.origin 只读

返回发送消息的 Client 的来源。

ExtendableMessageEvent.lastEventId 只读

Server-Sent Events 中,表示事件源的最后一个事件 ID。

ExtendableMessageEvent.source 只读

返回发送消息的 Client 对象的引用。

ExtendableMessageEvent.ports 只读

返回包含代表关联消息通道的端口的 MessagePort 对象的数组。

示例

在下面的示例中,一个页面通过 ServiceWorkerRegistration.active 获取了 ServiceWorker 对象的句柄,然后调用了它的 postMessage() 函数。

js
// main.js
if (navigator.serviceWorker) {
  navigator.serviceWorker.register("service-worker.js");

  navigator.serviceWorker.addEventListener("message", (event) => {
    // event is a MessageEvent object
    console.log(`The service worker sent me a message: ${event.data}`);
  });

  navigator.serviceWorker.ready.then((registration) => {
    registration.active.postMessage("Hi service worker");
  });
}

Service Worker 可以通过监听 message 事件来接收消息

js
// service-worker.js
addEventListener("message", (event) => {
  // event is an ExtendableMessageEvent object
  console.log(`The client sent me a message: ${event.data}`);

  event.source.postMessage("Hi client");
});

或者,脚本可以使用 onmessage 来监听消息

js
// service-worker.js
self.onmessage = (event) => {
  // event is an ExtendableMessageEvent object
  console.log(`The client sent me a message: ${event.data}`);

  event.source.postMessage("Hi client");
};

规范

规范
Service Workers
# eventdef-serviceworkerglobalscope-message
Service Workers
# dom-serviceworkerglobalscope-onmessage

浏览器兼容性

另见