Workery rozszerzeń obsługują zarówno zdarzenia standardowego workera usługi, jak i wiele zdarzeń w interfejsach API rozszerzeń. W tej sekcji opisano dostępne funkcje i wskazówki, jak z nich korzystać.
Deklarowanie zdarzeń rozszerzenia
Obsługi zdarzeń w usługach workera muszą być zadeklarowane w zakresie globalnym, co oznacza, że powinny znajdować się na najwyższym poziomie skryptu i nie mogą być zagnieżdżone wewnątrz funkcji. Dzięki temu są one rejestrowane synchronicznie podczas początkowego wykonywania skryptu, co umożliwia Chrome wysyłanie zdarzeń do workera usługi zaraz po jego uruchomieniu. Na przykład:
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 }); });
Typowe zdarzenia
Skrypty service worker obsługują zdarzenia w określonych interfejsach API. Poniżej opisujemy kilka najczęstszych. Pamiętaj, że niektóre z tych interfejsów API wymagają uprawnień, a inne mogą zawierać zdarzenia, metody lub właściwości, które nie są dostępne we wszystkich wersjach Chrome. Szczegółowe informacje znajdziesz w połączonej dokumentacji interfejsu API, zwłaszcza w części dotyczącej zdarzeń, metod i właściwości, których chcesz używać.
chrome.action- Wywoływany w odpowiedzi na interakcję użytkownika z ikoną na pasku narzędzi rozszerzenia, niezależnie od tego, czy działanie dotyczy konkretnej strony (karty) czy całego rozszerzenia.
chrome.management- Zdarzenia związane z instalacją, odinstalowaniem, włączeniem i wyłączeniem rozszerzeń.
chrome.notifications- Udostępnia generowane przez rozszerzenie zdarzenia związane z interakcją użytkownika z powiadomieniami systemowymi.
chrome.permissions- Wskazuje, kiedy użytkownik przyznaje lub odwołuje uprawnienia rozszerzenia.
chrome.runtime- Dostarcza zdarzenia związane z cyklem życia rozszerzenia, wiadomościami wysłanymi z innych części rozszerzenia oraz powiadomienie o dostępnym rozszerzeniu lub aktualizacji Chrome.
chrome.storage.onChanged- Uruchamiane za każdym razem, gdy dowolny obiekt
StorageAreazostanie wyczyszczony albo gdy wartość klucza zostanie zmieniona lub ustawiona. Pamiętaj, że każde wystąpienieStorageAreama własne zdarzenieonChanged. chrome.webNavigation- Pokazuje stan żądań nawigacji w locie.
Filtry
Aby ograniczyć zdarzenia do konkretnego przypadku użycia lub wyeliminować niepotrzebne wywołania zdarzeń, użyj interfejsów API, które obsługują filtry zdarzeń. Rozważ na przykład rozszerzenie, które nasłuchuje zdarzenia tabs.onUpdated, aby wykrywać, kiedy użytkownik przechodzi do określonej witryny. To zdarzenie będzie wywoływane przy każdej nawigacji na każdej karcie. Zamiast tego użyj funkcji webNavigation.onCompleted z filtrem. Na przykład:
const filter = {
url: [
{
urlMatches: 'https://www.google.com/',
},
],
};
chrome.webNavigation.onCompleted.addListener(() => {
console.info("The user has loaded my favorite website!");
}, filter);
Zdarzenia skryptu service worker
Instancje robocze usługi rozszerzeń obsługują więcej zdarzeń niż zdarzenia cyklu życia opisane w innym miejscu.
ServiceWorkerGlobal.fetch
Wywoływane, gdy coś jest pobierane z pakietu rozszerzenia lub gdy funkcje fetch() i XMLHttpRequest() są wywoływane z poziomu skryptu rozszerzenia lub skryptu wyskakującego okienka. (Wywołania ze skryptów treści nie są przechwytywane przez moduł obsługi fetch mechanizmu Service Worker). W tych ostatnich przypadkach musisz dodać adresy URL stron, które chcesz pobrać, do klucza "host_permissions" w manifest.json.
ServiceWorkerGlobal.message
Przekazywanie komunikatów skryptu service worker jest dostępne jako uzupełnienie przekazywania komunikatów przez rozszerzenie, ale oba systemy nie współpracują ze sobą. Oznacza to, że wiadomości wysyłane za pomocą sendMessage() (dostępnego w kilku interfejsach API rozszerzeń) nie są przechwytywane przez obsługujące je menedżery wiadomości w usługach działających w tle. Podobnie wiadomości wysyłane za pomocą postMessage() nie są przechwytywane przez moduły obsługi wiadomości rozszerzenia. Oba typy elementów obsługujących wiadomości (czyli ServiceWorkerGlobal.message i chrome.runtime.onMessage) są obsługiwane w elementach usługi rozszerzenia.
Zalecamy korzystanie z wiadomości rozszerzenia, chyba że masz konkretny powód, aby używać takich wiadomości.