runtime.onUserScriptMessage

使用此事件来监听来自扩展的 USER_SCRIPT worlds 的消息。

在 Firefox 中,此事件需要 userScripts 权限。在 Chrome 中,即使扩展未声明 userScripts 权限,此事件也始终可用。

用户脚本只能从由 userScripts.configureWorld() 配置且 messaging 设置为 trueUSER_SCRIPT world 使用 runtime.sendMessage 发送消息。

除了消息之外,监听器还会收到

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

语法

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

事件有三个函数

addListener(listener)

向此事件添加监听器。

removeListener(listener)

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

hasListener(listener)

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

addListener 语法

参数

监听器

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

message

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

sender

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

sendResponse

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

如果您在同一个文档中有多个 onUserScriptMessage 监听器,则只有一个可以发送响应。

要同步发送响应,请在监听器函数返回之前调用 sendResponse。要异步发送响应,请执行以下操作之一:

  • 保留 sendResponse 参数的引用,并从监听器函数返回 true。然后,您可以在监听器函数返回后调用 sendResponse
  • 从监听器函数返回一个 Promise,并在响应准备就绪时解析该 Promise。

示例

在此示例中,一个 ID 为 myScriptWorldUSER_SCRIPT world 中的用户脚本向注册它的扩展发送消息。

js
// The user script
// Send a message to the extension that registered the user script
browser.runtime.sendMessage("my message");
js
// The extension that registered the user script

function handleMessage(message, sender) {
  // check that the message originated from "myScriptWorld" world
  if (sender.userScriptWorldId === "myScriptWorld") {
    // process message
    console.log(message);
  }
}

browser.runtime.onUserScriptMessage.addListener(handleMessage);

扩展程序示例

浏览器兼容性