runtime.sendMessage()
Отправляет одно сообщение слушателям событий внутри вашей расширения или в другое расширение.
При отправке в ваше расширение, опустите аргумент extensionId. Событие runtime.onMessage будет срабатывать на каждой странице в вашем расширении, за исключением фрейма, который вызвал runtime.sendMessage.
При отправке в другое расширение, включите аргумент extensionId, установленный в ID другого расширения. Событие runtime.onMessageExternal будет срабатывать в другом расширении. По умолчанию, ваше расширение может обмениваться сообщениями с собой и любым другим расширением (определенным extensionId). Однако, ключ externally_connectable манифеста может быть использован для ограничения связи конкретными расширениями.
Расширения не могут отправлять сообщения скриптам контента с помощью этого метода. Для отправки сообщений скриптам контента используйте tabs.sendMessage.
Это асинхронная функция, которая возвращает Promise.
Примечание: Вы также можете использовать подход, основанный на соединении для обмена сообщениями.
Синтаксис
let sending = browser.runtime.sendMessage( extensionId, // optional string message, // any options // optional object )
Параметры
-
extensionIdНеобязательно -
string. ID расширения, которому нужно отправить сообщение. Включите это, чтобы отправить сообщение в другое расширение. Если предполагаемый получатель установил ID явно, используя ключ browser_specific_settings в manifest.json, тогдаextensionIdдолжно иметь это значение. В противном случае оно должно иметь ID, который был сгенерирован для предполагаемого получателя.Если
extensionIdопущено, сообщение отправляется вашему расширению. message-
any. Объект, который может быть сериализован с помощью структурного клонирования (см. Алгоритм клонирования данных). -
optionsНеобязательно -
object.-
includeTlsChannelIdНеобязательно -
boolean. Будет ли ID TLS канала передан вruntime.onMessageExternalдля процессов, которые слушают событие подключения.Этот параметр поддерживается только в браузерах на основе Chromium.
-
В зависимости от аргументов, эта API иногда неоднозначна. Используются следующие правила:
- если один аргумент, это сообщение для отправки, и сообщение будет отправлено внутренне.
-
если два аргумента:
- аргументы интерпретируются как
(message, options), и сообщение отправляется внутренне, если второй аргумент — любой из следующих:- объект
options(т.е., объект, который содержит только те свойстваoptions, которые поддерживаются браузером) - null
- undefined
- объект
- в противном случае аргументы интерпретируются как
(extensionId, message). Сообщение будет отправлено расширению, идентифицированному какextensionId.
- аргументы интерпретируются как
-
если три аргумента, аргументы интерпретируются как
(extensionId, message, options). Сообщение будет отправлено расширению, идентифицированному какextensionId.
Обратите внимание, что до Firefox 55 правила были другими в случае с 2 аргументами. По старым правилам, если первый аргумент был строкой, он обрабатывался как extensionId, а сообщение как второй аргумент. Это означало, что если вы вызывали sendMessage() с аргументами, такими как ("my-message", {}), тогда он отправлял бы пустое сообщение расширению, идентифицированному как «my-message». По новым правилам, с этими аргументами вы бы отправили сообщение «my-message» внутренне, с пустым объектом options.
Возвращаемое значение
A Promise. Если получатель отправил ответ, это будет выполнено с ответом. В противном случае это будет выполнено без аргументов. Если при подключении к расширению произошла ошибка, обещание будет отклонено с сообщением об ошибке.
Совместимость с браузерами
| Рабочий стол | Мобильный | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Internet Explorer | Opera | Safari | WebView Android | Chrome Android | Firefox для Android | Opera Android | Safari на IOS | Samsung Internet | |
sendMessage |
26 | 14runtime.onMessage слушатели в представлениях расширений получают отправленные ими сообщения. |
45 | ? | 15 | 14 | ? | ? | 48 | ? | 15 | ? |
Примеры
Вот скрипт контента, который отправляет сообщение фоновому скрипту, когда пользователь щелкает окно контента. Данные сообщения — {greeting: "Greeting from the content script"}, и отправитель также ожидает получить ответ, который обрабатывается в функции handleResponse:
// content-script.js function handleResponse(message) { console.log(`Message from the background script: ${message.response}`); } function handleError(error) { console.log(`Error: ${error}`); } function notifyBackgroundPage(e) { const sending = browser.runtime.sendMessage({ greeting: "Greeting from the content script", }); sending.then(handleResponse, handleError); } window.addEventListener("click", notifyBackgroundPage);
Соответствующий скрипт фона выглядит так:
// background-script.js function handleMessage(request, sender, sendResponse) { console.log(`A content script sent a message: ${request.greeting}`); sendResponse({ response: "Response from background script" }); } browser.runtime.onMessage.addListener(handleMessage);
Примечание: Вместо использования sendResponse(), рекомендуемый подход для дополнений Firefox — возвращение Promise. Примеры использования Promise доступны в разделе примеров слушателя runtime.onMessage.
Примеры расширений
- content-script-register
- devtools-panels
- export-helpers
- find-across-tabs
- mocha-client-tests
- notify-link-clicks-i18n
- store-collected-images
- user-script-register
- webpack-modules
Примечание: Эта API основана на API chrome.runtime Chromium. Данная документация получена из runtime.json кода Chromium.
© 2005–2023 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage