Workery rozszerzeń obsługują zarówno zdarzenia standardowego workera usługi, jak i wiele zdarzeń w interfejsach API rozszerzeń. Z tej sekcji dowiesz się, co jest dostępne, i uzyskasz wskazówki dotyczące korzystania z tych funkcji.
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
Workery w ramach usługi rozszerzenia obsługują zdarzenia w konkretnych 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
- Zdarzenia związane z interakcją użytkownika z powiadomieniami systemowymi generowanymi przez rozszerzenie.
chrome.permissions
- Wskazuje, kiedy użytkownik przyznaje lub odwołuje uprawnienia rozszerzenia.
chrome.runtime
- Zawiera zdarzenia związane z cyklem życia rozszerzenia, wiadomości wysyłane z innych części rozszerzenia oraz powiadomienia o dostępnym rozszerzeniu lub aktualizacji Chrome.
chrome.storage.onChanged
- Wywoływany, gdy obiekt
StorageArea
zostanie wyczyszczony lub gdy zmieni się wartość klucza lub zostanie ona ustawiona. Pamiętaj, że każde wystąpienieStorageArea
ma własne zdarzenieonChanged
. chrome.webNavigation
- Zawiera informacje o stanie żą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
Pracownicy obsługi rozszerzeń obsługują więcej zdarzeń cyklu życia niż te opisane w innych miejscach.
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
skryptu Service Worker). W tych ostatnich przypadkach musisz dodać adresy URL stron, które chcesz pobrać, do klucza "host_permissions"
w elementach manifest.json
.
ServiceWorkerGlobal.message
Przekazywanie wiadomości przez usługę workera jest dostępne oprócz przekazywania wiadomości przez rozszerzenie, ale te dwa systemy nie są ze sobą kompatybilne. 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. Oba typy elementów obsługi wiadomości, czyli ServiceWorkerGlobal.message
i chrome.runtime.onMessage
, są obsługiwane przez elementy usługi rozszerzenia.
Należy preferować wiadomości w rozszerzeniu, chyba że masz konkretny powód, aby używać wiadomości w usługach workera.