此页面由社区从英文翻译而来。了解更多并加入 MDN Web Docs 社区。

View in English Always switch to English

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

示例扩展

浏览器兼容性

备注:此 API 基于 Chromium 的 chrome.tabs API。该文档衍生自 Chromium 代码中的 tabs.json