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.json
的content_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
。