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" }); }); 示例扩展
浏览器兼容性
备注:此 API 基于 Chromium 的 chrome.tabs API。该文档衍生自 Chromium 代码中的 tabs.json。