runtime.onMessageExternal

使用此事件来侦听来自其他扩展或网页的消息。

默认情况下,扩展可以接收来自任何其他扩展的消息。但是,可以使用 externally_connectable manifest 键将通信限制为特定的扩展,并启用与网站的通信。

要发送一条由 onMessageExternal 侦听器接收的消息,请使用 runtime.sendMessage(),并在 extensionId 参数中传递接收者的 ID。

除了消息本身,侦听器还会接收

  • 一个 sender 对象,其中包含有关消息发送者的详细信息。
  • 一个 sendResponse 函数,侦听器可以使用该函数将响应发送回发件人。

此 API 不能在内容脚本中使用。

有关接收消息和发送响应的更多信息,以及发送响应的各种选项的示例,请参阅 runtime.onMessage

语法

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

事件有三个函数

addListener(listener)

向此事件添加监听器。

removeListener(listener)

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

hasListener(listener)

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

addListener 语法

参数

监听器

此事件发生时调用的函数。该函数会传递以下参数:

message

object。消息。这是一个可 JSON 化的对象。

sender

一个 runtime.MessageSender 对象,表示消息的发送者。

sendResponse

一个最多调用一次的函数,用于将响应发送回消息。该函数接受一个参数,该参数是一个可 JSON 化的对象。此参数将传递回消息发件人。

如果您在同一文档中有多个 onMessageExternal 侦听器,那么只有一个可以发送响应。

要同步发送响应,请在侦听器函数返回之前调用 sendResponse()

要异步发送响应,请使用以下选项之一:

  • 从侦听器函数返回一个 Promise,并在响应准备就绪时解析该 Promise。这是首选方法。

  • 保留 sendResponse() 参数的引用,并从侦听器函数返回 true。然后,您可以在侦听器函数返回后调用 sendResponse()

    注意: 直到 Chrome bug 1185241 解决之前,Chrome 不支持 Promise 作为返回值。作为替代方案,请返回 true 并使用 sendResponseruntime.onMessage 所述

示例

在此示例中,扩展 "blue@mozilla.org" 向扩展 "red@mozilla.org" 发送消息。

js
// sender: browser.runtime.id === "blue@mozilla.org"

// Send a message to the extension whose ID is "red@mozilla.org"
browser.runtime.sendMessage("red@mozilla.org", "my message");
js
// recipient: browser.runtime.id === "red@mozilla.org"

function handleMessage(message, sender) {
  // check that the message is from "blue@mozilla.org"
  if (sender.id === "blue@mozilla.org") {
    // process message
  }
}

browser.runtime.onMessageExternal.addListener(handleMessage);

浏览器兼容性

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