Client: postMessage() 方法

Baseline 已广泛支持

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

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

Client 接口的 postMessage() 方法允许 service worker 向客户端(WindowWorkerSharedWorker)发送消息。消息在 navigator.serviceWorker 上的 message 事件中接收。

语法

js
postMessage(message)
postMessage(message, transfer)
postMessage(message, options)

参数

message

要发送给客户端的消息。可以是任何 结构化克隆类型

注意: service worker 与其客户端不在同一个 代理集群 中,因此无法共享内存。SharedArrayBuffer 对象或其支持的缓冲视图不能跨代理集群发送。尝试这样做会在接收端产生一个包含 DataCloneError DOMExceptionmessageerror 事件。

transfer 可选

一个可选的可传输对象数组,用于转移所有权。这些对象的所有权将转移到目标方,并且它们在发送方不再可用。这些可传输对象应该附加到消息中;否则它们将被移动,但在接收端实际上无法访问。

options 可选

一个包含以下属性的可选对象

transfer 可选

transfer 参数具有相同的含义。

返回值

无(undefined)。

示例

下面的代码从 service worker 向客户端发送消息。客户端使用 service worker 作用域中的全局对象 clients 上的 get() 方法获取。

js
addEventListener("fetch", (event) => {
  event.waitUntil(
    (async () => {
      // Exit early if we don't have access to the client.
      // Eg, if it's cross-origin.
      if (!event.clientId) return;

      // Get the client.
      const client = await self.clients.get(event.clientId);
      // Exit early if we don't get the client.
      // Eg, if it closed.
      if (!client) return;

      // Send a message to the client.
      client.postMessage({
        msg: "Hey I just got a fetch from you!",
        url: event.request.url,
      });
    })(),
  );
});

接收该消息

js
navigator.serviceWorker.addEventListener("message", (event) => {
  console.log(event.data.msg, event.data.url);
});

规范

规范
Service Workers
# dom-client-postmessage-message-options

浏览器兼容性