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