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);

擴充套件程式示例

瀏覽器相容性