Работники службы расширения поддерживают как стандартные события работника службы , так и многие события в 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 требуются разрешения, а другие могут иметь события, методы или свойства, которые доступны не во всех версиях 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);
События рабочего веб-сервиса
Работники службы расширения поддерживают не только события жизненного цикла , описанные в других местах .
ServiceWorkerGlobal.fetch
Запускается, когда что-либо извлекается из пакета расширения или когда fetch()
и XMLHttpRequest()
вызываются из сценария расширения или всплывающего окна. (Вызовы из сценариев контента не перехватываются обработчиком fetch
сервисного работника.) В последних случаях вам нужно будет добавить URL-адреса страниц, которые вы хотите получить, к ключу "host_permissions"
в файле manifest.json
.
ServiceWorkerGlobal.message
Передача сообщений сервисного работника доступна в дополнение к передаче сообщений расширения, но эти две системы несовместимы. Это означает, что сообщения, отправленные с помощью sendMessage()
(который доступен из нескольких API расширений), не перехватываются обработчиками сообщений сервисного работника. Аналогично, сообщения, отправленные с помощью postMessage()
не перехватываются обработчиками сообщений расширения. Оба типа обработчиков сообщений — то есть как ServiceWorkerGlobal.message
, так и chrome.runtime.onMessage
— поддерживаются в работниках служб расширений.
Вам следует отдать предпочтение обмену сообщениями с расширениями , если у вас нет особой причины использовать обмен сообщениями сервисных работников.