Spec-Zone.ru › Web Extensions

tabs.sendMessage()

Отправляет одно сообщение из фоновых скриптов расширения (или других скриптов с привилегиями, таких как скрипты всплывающего окна или страницы настроек) любому скрипту содержимого или страницам/iframe расширения, которые принадлежат расширению и выполняются в указанной вкладке.

Сообщение будет получено в контексте расширения любыми обработчиками события runtime.onMessage. Обработчики могут необязательно вернуть что-либо в качестве ответа отправителю.

Это асинхронная функция, которая возвращает Promise.

Примечание: Вы также можете использовать подход на основе соединений для обмена сообщениями.

Синтаксис

const sending = browser.tabs.sendMessage(
  tabId,     // integer
  message,   // any
  options    // optional object
)

Параметры

tabId

integer. Идентификатор вкладки, скриптам содержимого которой мы хотим отправить сообщение.

message

any. Объект, который можно сериализовать (см. алгоритм клонирования данных).

options Необязательно

object.

frameId Необязательно

integer. Отправляет сообщение в определённую рамку, идентифицированную по frameId, вместо всех рамок во вкладке. Выполняется ли скрипт содержимого во всех рамках, зависит от параметра all_frames в разделе content_scripts manifest.json.

Значение возврата

A Promise, который будет выполнен с объектом ответа, отправленным обработчиком сообщения в скрипте содержимого, или без аргументов, если скрипт содержимого не отправил ответ.

Если при подключении к указанной вкладке или по любой другой причине произойдёт ошибка, обещание будет отклонено с сообщением об ошибке.

Если несколько рамок отвечают на сообщение, обещание выполняется с одним из ответов.

Примеры

Вот пример скрипта фоновой части, который отправляет сообщение скриптам содержимого, выполняющимся в активной вкладке, при нажатии пользователем действия браузера. Скрипт фоновой части также ожидает, что скрипт содержимого отправит ответ:

// background-script.js
"use strict";

function onError(error) {
  console.error(`Error: ${error}`);
}

function sendMessageToTabs(tabs) {
  for (const tab of tabs) {
    browser.tabs
      .sendMessage(tab.id, { greeting: "Hi from background script" })
      .then((response) => {
        console.log("Message from the content script:");
        console.log(response.response);
      })
      .catch(onError);
  }
}

browser.browserAction.onClicked.addListener(() => {
  browser.tabs
    .query({
      currentWindow: true,
      active: true,
    })
    .then(sendMessageToTabs)
    .catch(onError);
});

Вот соответствующий скрипт содержимого:

// content-script.js
"use strict";

browser.runtime.onMessage.addListener((request) => {
  console.log("Message from the background script:");
  console.log(request.greeting);
  return Promise.resolve({ response: "Hi from content script" });
});

Примеры расширений

  • beastify
  • cookie-bg-picker
  • imagify

Совместимость с браузерами

Рабочий стол Мобильные устройства
Chrome Edge Firefox Internet Explorer Opera Safari WebView Android Chrome Android Firefox for Android Opera Android Safari on IOS Samsung Internet
sendMessage Да
14Ответ не отправляется после обновления вкладки получателя, если нет обработчика runtime.onMessage.
45 ? Да 14 ? ? 54 ? 15 ?

Примечание: Этот API основан на API chrome.tabs Chromium. Данная документация взята из tabs.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/tabs/sendMessage

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API