runtime.connect()
在扩展程序中的不同上下文之间建立连接。
你可以在以下位置调用此方法:
- 在扩展程序的content scripts中,用于与扩展程序的background scripts(或特权类似的脚本,如popup scripts或options page scripts)建立连接。
- 在扩展程序的background scripts(或特权类似的脚本)中,用于与另一个扩展程序建立连接。
请注意,你不能使用此函数连接扩展程序与其content scripts。要实现此目的,请使用 tabs.connect()。
默认情况下,此连接允许扩展程序与其自身或其他任何扩展程序(如果指定了 extensionId)交换消息。但是,可以使用 externally_connectable manifest 键将通信限制为特定扩展程序,并启用与网站的通信。扩展程序内部的连接会触发 runtime.onConnect 事件,来自其他扩展程序或网页的连接会触发 runtime.onConnectExternal 事件。
语法
let port = browser.runtime.connect(
extensionId, // optional string
connectInfo // optional object
)
参数
extensionId可选-
string。要连接的扩展程序的 ID。如果目标使用 manifest.json 中的 browser_specific_settings 键显式设置了 ID,则extensionId应为该值。否则,它应为为目标生成的 ID。 connectInfo可选-
object。连接的详细信息name可选-
string。将传递给正在监听连接事件的进程的runtime.onConnect。 includeTlsChannelId可选-
boolean。是否将 TLS 通道 ID 传递给正在监听连接事件的进程的runtime.onConnectExternal。
返回值
runtime.Port。用于发送和接收消息的端口。如果扩展程序不存在,则会触发端口的 onDisconnect 事件。
示例
此内容脚本
- 连接到 background script,并将
Port存储在名为myPort的变量中。 - 监听
myPort上的消息并记录它们。 - 当用户点击文档时,使用
myPort向 background script 发送消息。
// content-script.js
let myPort = browser.runtime.connect({ name: "port-from-cs" });
myPort.postMessage({ greeting: "hello from content script" });
myPort.onMessage.addListener((m) => {
console.log("In content script, received message from background script: ");
console.log(m.greeting);
});
document.body.addEventListener("click", () => {
myPort.postMessage({ greeting: "they clicked the page!" });
});
相应的后台脚本
-
监听来自 content script 的连接尝试。
-
当收到连接尝试时
- 将端口存储在名为
portFromCS的变量中。 - 使用该端口向 content script 发送消息。
- 开始监听通过端口接收到的消息,并记录它们。
- 将端口存储在名为
-
当用户点击扩展程序的 browser action 时,使用
portFromCS向 content script 发送消息。
// background-script.js
let portFromCS;
function connected(p) {
portFromCS = p;
portFromCS.postMessage({ greeting: "hi there content script!" });
portFromCS.onMessage.addListener((m) => {
console.log("In background script, received message from content script");
console.log(m.greeting);
});
}
browser.runtime.onConnect.addListener(connected);
browser.browserAction.onClicked.addListener(() => {
portFromCS.postMessage({ greeting: "they clicked the button!" });
});
浏览器兼容性
加载中…
注意: 此 API 基于 Chromium 的 chrome.runtime API。本文档源自 Chromium 代码中的 runtime.json。