tabs.sendMessage()

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

消息将在扩展程序上下文中由 runtime.onMessage 事件的任何监听器接收。监听器可以选择性地返回某些内容作为对发件人的响应。

这是一个异步函数,返回一个 Promise

注意:您也可以使用 基于连接的交换消息方法

语法

js
const sending = browser.tabs.sendMessage(
  tabId,     // integer
  message,   // any
  options    // optional object
)

参数

tabId

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

message

任何。一个可以序列化的对象(参见 数据克隆算法)。

options 可选

对象.

frameId 可选

整数。将消息发送到由 frameId 标识的特定帧,而不是标签页中的所有帧。内容脚本是否在所有帧中执行取决于 manifest.jsoncontent_scripts 部分的 all_frames 设置。

返回值

一个 Promise,它将用内容脚本中消息处理程序发送的响应对象来完成,或者在内容脚本没有发送响应的情况下没有参数来完成。

如果在连接到指定标签页时发生错误,或者发生任何其他错误,则 promise 将被错误消息拒绝。

如果多个帧响应消息,则 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);
});

以下对应的内容脚本

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 表仅在启用了 JavaScript 的浏览器中加载。

注意:此 API 基于 Chromium 的 chrome.tabs API。本文档来自 Chromium 代码中的 tabs.json