Service Worker 中的事件

擴充功能服務工作人員支援標準服務工作人員事件,以及擴充功能 API 中的許多事件。本節說明可用的功能,並提供使用提示。

宣告擴充功能事件

服務工作人員中的事件處理常式必須在全域範圍內聲明,也就是說,這些常式應位於指令碼的頂層,且不得巢狀內嵌於函式中。這可確保系統在初始指令碼執行時同步註冊,讓 Chrome 啟動後立即將事件分派至 Service Worker。例如:

不建議
browser.storage.local.get(["badgeText"], ({ badgeText }) => {
  browser.action.setBadgeText({ text: badgeText });
  browser.action.onClicked.addListener(handleActionClick);
});
較好
browser.action.onClicked.addListener(handleActionClick);

browser.storage.local.get(["badgeText"], ({ badgeText }) => {
  browser.action.setBadgeText({ text: badgeText });
});

常見活動

擴充功能服務工作人員支援特定 API 中的事件。以下將說明幾個常見的錯誤。請注意,部分 API 需要權限才能使用,其他 API 可能有事件、方法或屬性,但並非所有 Chrome 版本都適用。詳情請參閱連結的 API 說明文件,特別是您想使用的事件、方法或屬性。

browser.action
使用者與擴充功能的工具列圖示互動時,無論該動作是針對特定網頁 (分頁) 或整個擴充功能,都會觸發這個事件。
browser.management
提供與擴充功能安裝、解除安裝、啟用和停用相關的事件。
browser.notifications
提供與使用者和擴充功能產生的系統通知互動相關的事件。
browser.permissions
指出使用者授予或撤銷擴充功能權限的時間。
browser.runtime
提供與擴充功能生命週期相關的事件、從擴充功能其他部分傳送的訊息,以及擴充功能或 Chrome 更新通知。
browser.storage.onChanged
每當清除任何 StorageArea 物件,或變更/設定鍵的值時,系統就會觸發這個事件。請注意,每個 StorageArea 執行個體都有自己的 onChanged 事件。
browser.webNavigation
提供有關飛行中導覽要求的狀態資訊。

篩選器

如要將事件限制在特定用途,或排除不必要的事件呼叫,請使用支援事件篩選器的 API。舉例來說,假設擴充功能正在監聽 tabs.onUpdated 事件,以偵測使用者何時前往特定網站。系統會在每個分頁的每次導覽中呼叫這個事件。請改用 webNavigation.onCompleted 搭配篩選器。例如:

const filter = {
  url: [
    {
      urlMatches: 'https://www.google.com/',
    },
  ],
};

browser.webNavigation.onCompleted.addListener(() => {
  console.info("The user has loaded my favorite website!");
}, filter);

Web Service Worker 事件

擴充功能服務工作人員支援的生命週期事件,比其他地方所述更多。

ServiceWorkerGlobal.fetch

從擴充功能套件擷取任何內容時,或從擴充功能或彈出式視窗指令碼呼叫 fetch()XMLHttpRequest() 時,就會觸發這個事件。(Service Worker fetch 處理常式不會攔截來自內容指令碼的呼叫)。在後者情況下,您需要在 manifest.json"host_permissions" 鍵中,加入要擷取的網頁網址。

ServiceWorkerGlobal.message

除了擴充功能訊息傳遞外,Service Worker 訊息傳遞也適用,但這兩個系統無法互通。也就是說,使用 sendMessage() (可透過多個擴充功能 API 取得) 傳送的訊息不會遭到 Service Worker 訊息處理常式攔截。同樣地,擴充功能訊息處理常式不會攔截使用 postMessage() 傳送的訊息。擴充功能服務工作人員支援這兩種訊息處理常式,也就是 ServiceWorkerGlobal.messagebrowser.runtime.onMessage

除非有使用 Service Worker 訊息的具體原因,否則建議使用擴充功能訊息