tabs.sendMessage()
從擴充套件的後臺指令碼(或其他特權指令碼,例如彈出指令碼或選項頁面指令碼)向屬於該擴充套件並且正在指定標籤頁中執行的任何 內容指令碼 或擴充套件頁面/iframe 傳送單個訊息。
訊息將在擴充套件上下文中被 runtime.onMessage 事件的所有偵聽器接收。偵聽器隨後可以選擇返回某些內容作為對傳送者的響應。
這是一個非同步函式,返回一個 Promise。
注意: 您也可以使用 基於連線的訊息交換方法。
語法
js
const sending = browser.tabs.sendMessage(
tabId, // integer
message, // any
options // optional object
)
引數
tabId-
integer。我們要傳送訊息的內容指令碼所在的標籤頁的 ID。 message-
any。一個可以序列化的物件(參見 資料克隆演算法)。 options可選-
object.frameId可選-
integer。將訊息傳送到由frameId標識的特定框架,而不是標籤頁中的所有框架。內容指令碼是否在所有框架中執行取決於manifest.json的content_scripts部分中的all_frames設定。
返回值
一個 Promise,它將以內容指令碼中的訊息處理程式傳送的響應物件來 fulfilled,或者在內容指令碼未傳送響應時以無引數 fulfilled。
如果在連線到指定標籤頁時發生錯誤或發生任何其他錯誤,Promise 將以錯誤訊息被 rejected。
如果多個框架響應訊息,Promise 將解析為其中一個答案。
示例
以下是一個示例,展示了當使用者點選瀏覽器操作時,後臺指令碼如何向活動標籤頁中執行的內容指令碼傳送訊息。後臺指令碼還期望內容指令碼傳送響應。
js
// background-script.js
"use strict";
function onError(error) {
console.error(`Error: ${error}`);
}
function sendMessageToTabs(tabs) {
for (const tab of tabs) {
browser.tabs
.sendMessage(tab.id, { greeting: "Hi from background script" })
.then((response) => {
console.log("Message from the content script:");
console.log(response.response);
})
.catch(onError);
}
}
browser.browserAction.onClicked.addListener(() => {
browser.tabs
.query({
currentWindow: true,
active: true,
})
.then(sendMessageToTabs)
.catch(onError);
});
以下是相應的 content script
js
// content-script.js
"use strict";
browser.runtime.onMessage.addListener((request) => {
console.log("Message from the background script:");
console.log(request.greeting);
return Promise.resolve({ response: "Hi from content script" });
});
擴充套件程式示例
瀏覽器相容性
載入中…
注意:此 API 基於 Chromium 的 chrome.tabs API。此文件源自 Chromium 程式碼中的 tabs.json。