runtime.sendMessage()
向扩展程序内的事件侦听器或另一个扩展程序发送单个消息。
如果要发送到您的扩展程序,请省略 extensionId 参数。您扩展程序中的每个页面都会触发 runtime.onMessage 事件,但调用 runtime.sendMessage 的框架除外。
如果要发送到另一个扩展程序,请包含 extensionId 参数,并将其设置为另一个扩展程序的 ID。runtime.onMessageExternal 将会在另一个扩展程序中触发。默认情况下,您的扩展程序可以与自身以及任何其他扩展程序(由 extensionId 定义)进行消息交换。但是,externally_connectable manifest 键可用于限制与特定扩展程序的通信。
扩展程序无法通过此方法向内容脚本发送消息。要向内容脚本发送消息,请使用 tabs.sendMessage。
这是一个异步函数,返回一个 Promise。
注意: 您也可以使用 基于连接的消息交换方法。
语法
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),并且消息将在内部发送,前提是第二个参数是以下任何一种:- 一个有效的
options对象(即,该对象仅包含浏览器支持的options属性)。 - null
- 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 函数中处理。
// 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);
相应的后台脚本如下所示:
// 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。