Service Worker 中的事件

擴充功能服務工作站支援標準 Service 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 });
});

常見事件

擴充功能服務工作站支援特定 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);

Web Service Worker 事件

擴充功能服務工作站支援的生命週期超過其他說明的生命週期事件。

ServiceWorkerGlobal.fetch

從擴充功能套件擷取任何內容,或從擴充功能或彈出式視窗指令碼呼叫 fetch()XMLHttpRequest() 時觸發。(服務工作站 fetch 處理常式不會攔截來自內容指令碼的呼叫)。若是第二種情況,您必須將要擷取的網頁網址新增到 manifest.json 中的 "host_permissions" 鍵。

ServiceWorkerGlobal.message

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

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