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.jsoncontent_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