tabs.sendMessage()

从扩展的后台脚本(或其他特权脚本,如弹出窗口脚本或选项页脚本)向任何运行在指定标签页中的内容脚本或在扩展的页面或 iframe 发送一条消息。

该消息将在扩展上下文中由监听 runtime.onMessage 事件的监听器接收。监听器可以选择性地返回一个响应给发送者。

这是一个返回 Promise 的异步函数。

备注:你还可以使用基于连接的消息传递

语法

js
const sending = browser.tabs.sendMessage(
  tabId, // 整型
  message, // 任意
  options, // 可选的对象
);

参数

tabId

integer。要向其发送消息的标签页的 ID。

message

any。可序列化的对象(参见数据克隆算法)。

options 可选

object

frameId 可选

integer。将消息发送到指定的框架(frame),而不是标签页中的所有框架。内容脚本是否在所有框架中执行取决于 manifest.jsoncontent_scripts 部分中的 all_frames 设置。

返回值

一个 Promise,如果内容脚本未发送响应其会被兑现且不带有参数。

如果在连接到指定标签页时或发生任何其他错误时出现错误,promise 将以错误信息拒绝。

如果多个框架响应了消息,promise 会兑现为其中一个响应。

示例

以下是一个后台脚本示例,当用户点击浏览器操作按钮时,向当前活动标签页中运行的内容脚本发送消息。后台脚本还期望内容脚本发送一个响应:

js
// background-script.js
"use strict";

function onError(error) {
  console.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);
});

以下是相应的内容脚本示例:

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" });
});

示例扩展

浏览器兼容性

BCD tables only load in the browser

备注:这个 API 基于 Chromium 的 chrome.tabs API。本文档内容源自 Chromium 代码中的 tabs.json