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
StorageArea
zostanie wyczyszczony albo gdy wartość klucza zostanie zmieniona lub ustawiona. Pamiętaj, że każde wystąpienieStorageArea
ma 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.