runtime.sendMessage()

向扩展程序内的事件侦听器或另一个扩展程序发送单个消息。

如果要发送到您的扩展程序,请省略 extensionId 参数。您扩展程序中的每个页面都会触发 runtime.onMessage 事件,但调用 runtime.sendMessage 的框架除外。

如果要发送到另一个扩展程序,请包含 extensionId 参数,并将其设置为另一个扩展程序的 ID。runtime.onMessageExternal 将会在另一个扩展程序中触发。默认情况下,您的扩展程序可以与自身以及任何其他扩展程序(由 extensionId 定义)进行消息交换。但是,externally_connectable manifest 键可用于限制与特定扩展程序的通信。

扩展程序无法通过此方法向内容脚本发送消息。要向内容脚本发送消息,请使用 tabs.sendMessage

这是一个异步函数,返回一个 Promise

注意: 您也可以使用 基于连接的消息交换方法

语法

js
let sending = browser.runtime.sendMessage(
  extensionId,             // optional string
  message,                 // any
  options                  // optional object
)

参数

extensionId 可选

string。要发送消息的扩展程序的 ID。要将消息发送到另一个扩展程序,请包含此参数。如果目标接收者已使用 manifest.json 中的 browser_specific_settings 键显式设置了 ID,则 extensionId 应具有该值。否则,它应具有为目标接收者生成的 ID。

如果省略 extensionId,则消息将发送到您的扩展程序。

message

any。一个对象,可以进行结构化克隆序列化(参见 数据克隆算法)。

options 可选

object.

includeTlsChannelId 可选

boolean。是否将 TLS 通道 ID 传递给 runtime.onMessageExternal,以供正在监听连接事件的进程使用。

此选项仅在基于 Chromium 的浏览器中受支持。

根据传递的参数,此 API 有时会存在歧义。以下规则用于确定参数的含义:

  • 如果只提供一个参数,则该参数是发送的消息,并且消息将在内部发送。

  • 如果提供两个参数:

    • 参数被解释为 (message, options),并且消息将在内部发送,前提是第二个参数是以下任何一种:

      1. 一个有效的 options 对象(即,该对象仅包含浏览器支持的 options 属性)。
      2. null
      3. undefined
    • 否则,参数将被解释为 (extensionId, message)。消息将发送到由 extensionId 标识的扩展程序。

  • 如果提供三个参数,则参数被解释为 (extensionId, message, options)。消息将发送到由 extensionId 标识的扩展程序。

请注意,在 Firefox 55 之前,2 参数情况下的规则有所不同。在旧规则下,如果第一个参数是字符串,它将被视为 extensionId,第二个参数是消息。这意味着,如果您使用 ("my-message", {}) 作为参数调用 sendMessage(),它会将一个空消息发送到 ID 为 "my-message" 的扩展程序。在新的规则下,使用这些参数,您将发送消息 "my-message" 到内部,并附带一个空的 options 对象。

返回值

一个 Promise。如果接收方发送了响应,则此 Promise 将会以响应进行 fulfilled。否则,它将以无参数进行 fulfilled。如果连接到扩展程序时发生错误,Promise 将会以错误消息被 rejected。

示例

这是一个内容脚本,当用户单击内容窗口时,它会向后台脚本发送一条消息。消息载荷为 {greeting: "Greeting from the content script"},发送方还期望收到响应,该响应将在 handleResponse 函数中处理。

js
// content-script.js

function handleResponse(message) {
  console.log(`Message from the background script: ${message.response}`);
}

function handleError(error) {
  console.log(`Error: ${error}`);
}

function notifyBackgroundPage(e) {
  const sending = browser.runtime.sendMessage({
    greeting: "Greeting from the content script",
  });
  sending.then(handleResponse, handleError);
}

window.addEventListener("click", notifyBackgroundPage);

相应的后台脚本如下所示:

js
// background-script.js
function handleMessage(request, sender, sendResponse) {
  console.log(`A content script sent a message: ${request.greeting}`);
  sendResponse({ response: "Response from background script" });
}

browser.runtime.onMessage.addListener(handleMessage);

注意: 与其使用 sendResponse(),不如返回一个 Promise 是 Firefox 扩展程序的推荐方法。使用 Promise 的示例可在 runtime.onMessage 侦听器的 示例部分 中找到。

扩展程序示例

浏览器兼容性

注意: 此 API 基于 Chromium 的 chrome.runtime API。本文档源自 Chromium 代码中的 runtime.json