runtime.connect()

在扩展内部的不同上下文之间建立连接。

你可以调用这个

  • 在扩展的内容脚本中,以与扩展的后台脚本(或类似权限的脚本,如弹出窗口脚本或选项页面脚本)建立连接。
  • 在扩展的后台脚本(或类似权限的脚本)中,以与其他扩展建立连接。

请注意,你无法使用此函数将扩展连接到其内容脚本。要执行此操作,请使用 tabs.connect()

默认情况下,此连接使扩展能够与自身或任何其他扩展(如果指定了 extensionId)交换消息。但是,externally_connectable 清单键可用于将通信限制为特定扩展并启用与网站的通信。扩展内的连接会触发 runtime.onConnect 事件,来自其他扩展或网页的连接会触发 runtime.onConnectExternal 事件。

语法

js
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 事件。

浏览器兼容性

BCD 表仅在浏览器中加载

示例

此内容脚本

  • 连接到后台脚本并将 Port 存储在名为 myPort 的变量中。
  • 侦听 myPort 上的消息并记录它们。
  • 当用户单击文档时,使用 myPort 向后台脚本发送消息。
js
// 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!" });
});

相应的后台脚本

  • 侦听来自内容脚本的连接尝试。
  • 当它收到连接尝试时
    • 将端口存储在名为 portFromCS 的变量中。
    • 使用端口向内容脚本发送消息。
    • 开始侦听在端口上接收到的消息,并记录它们。
  • 当用户单击扩展的浏览器操作时,使用 portFromCS 向内容脚本发送消息。
js
// 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