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