Service Worker 中的事件

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

宣告擴充功能事件

服務工作者中的事件處理常式必須在全域範圍中宣告,也就是說,這些事件處理常式應位於指令碼的頂層,且不得在函式中巢狀。這可確保在初始指令碼執行時同步註冊,讓 Chrome 在服務工作者啟動後立即將事件調度至服務工作者。例如:

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

較好
chrome.action.onClicked.addListener(handleActionClick);

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

常見事件

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

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

篩選器

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

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

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

網路服務 worker 事件

擴充功能服務工作站支援的生命週期事件不限於其他位置所述

ServiceWorkerGlobal.fetch

在從擴充功能套件擷取任何內容,或從擴充功能或彈出式指令碼呼叫 fetch()XMLHttpRequest() 時觸發。(服務工作者 fetch 處理常式不會攔截內容指令碼的呼叫)。在後一種情況下,您必須將要擷取的網頁網址新增至 manifest.json 中的 "host_permissions" 鍵。

ServiceWorkerGlobal.message

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

除非您有使用服務工作程式訊息的具體原因,否則應優先使用擴充功能訊息