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