runtime.onConnectExternal

当扩展程序收到来自另一个扩展程序的连接请求时触发。

要发送一个消息,该消息将被 onConnectExternal 监听器接收,请使用 runtime.connect(),并在 extensionId 参数中传递接收者的 ID。

监听器会收到一个 runtime.Port 对象,然后可以使用该对象发送和接收消息。Port 对象还包含一个 sender 属性,该属性是一个 runtime.MessageSender 对象,接收者可以使用它来检查发送者的 ID。

语法

js
browser.runtime.onConnectExternal.addListener(listener)
browser.runtime.onConnectExternal.removeListener(listener)
browser.runtime.onConnectExternal.hasListener(listener)

事件有三个函数

addListener(listener)

向此事件添加监听器。

removeListener(listener)

停止监听此事件。listener 参数是要移除的监听器。

hasListener(listener)

检查此事件是否已注册 listener。如果正在侦听,则返回 true,否则返回 false

addListener 语法

参数

function

当此事件发生时调用的函数。该函数将传递此参数

port

一个 runtime.Port 对象,连接当前脚本与它正在连接的另一个扩展程序。

示例

在此示例中,Hansel 扩展程序连接到 Gretel 扩展程序

js
console.log("connecting to Gretel");
let myPort = browser.runtime.connect("gretel@mozilla.org");

myPort.onMessage.addListener((message) => {
  console.log(`From Gretel: ${message.content}`);
});

browser.browserAction.onClicked.addListener(() => {
  myPort.postMessage({ content: "Hello from Hansel" });
});

Gretel 监听连接并检查发送者是否真的是 Hansel

js
let portFromHansel;

browser.runtime.onConnectExternal.addListener((port) => {
  console.log(port);
  if (port.sender.id === "hansel@mozilla.org") {
    console.log("connection attempt from Hansel");
    portFromHansel = port;
    portFromHansel.onMessage.addListener((message) => {
      console.log(`From Hansel: ${message.content}`);
    });
  }
});

browser.browserAction.onClicked.addListener(() => {
  portFromHansel.postMessage({ content: "Message from Gretel" });
});

浏览器兼容性

注意:此 API 基于 Chromium 的 chrome.runtime API。本文档源自 Chromium 代码中的 runtime.json