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。