Spec-Zone.ru › Web Extensions

menus.create()

Создаёт новую пункта меню, задавая объект настроек, определяющий свойства элемента.

В отличие от других асинхронных функций, эта функция не возвращает промис, а использует необязательный обратный вызов для передачи информации об успехе или ошибке. Это связано с тем, что её результат — это идентификатор нового элемента.

Для совместимости с другими браузерами, Firefox предоставляет этот метод как через пространство имён contextMenus , так и через пространство имён menus. Однако, следует учитывать, что создать пункты меню инструментов (contexts: ["tools_menu"]) с помощью пространства имён contextMenus невозможно.

Синтаксис

browser.menus.create(
  createProperties, // object
  () => {/* … */}   // optional function
)

Параметры

createProperties

object. Свойства нового пункта меню.

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

boolean. Начальное состояние пункта типа флажок или переключатель: true для выбранного и false для невыбранного. Только один пункт переключатель может быть выбран в группе.

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

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

  • "_execute_browser_action": имитирует нажатие на действие расширения, открывая всплывающее окно, если оно есть (только Manifest V2)
  • "_execute_action": имитирует нажатие на действие расширения, открывая всплывающее окно, если оно есть (только Manifest V3)
  • "_execute_page_action": имитирует нажатие на действие страницы расширения, открывая всплывающее окно, если оно есть
  • "_execute_sidebar_action": открывает боковую панель расширения

См. документацию по специальным командам в ключе manifest.json commands для подробностей.

При указании одного из распознаваемых значений нажатие на элемент не вызывает событие menus.onClicked; вместо этого срабатывает стандартное действие, например, открытие всплывающего окна. В противном случае нажатие на элемент вызывает событие menus.onClicked, и его можно использовать для реализации резервного поведения.

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

array menus.ContextType. Массив контекстов, в которых будет отображаться этот пункт меню. Если этот параметр опущен:

  • если у родительского элемента установлены контексты, то этот элемент унаследует контексты родителя
  • в противном случае, элементу присваивается массив контекстов ["page"].
documentUrlPatterns Необязательно

array string. Позволяет ограничить применение элемента только к документам, адрес которых соответствует одному из заданных шаблонов сопоставления. Это также относится к фреймам.

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

boolean. Включён или отключён ли этот пункт меню. По умолчанию true.

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

object. Один или несколько пользовательских значков для отображения рядом с элементом. Пользовательские значки могут быть установлены только для элементов, отображаемых в подменю. Этот параметр представляет собой объект с одним свойством для каждого предоставленного значка: имя свойства должно включать размер значка в пикселях, а путь является относительным к значку из корневого каталога расширения. Браузер пытается выбрать значок размером 16x16 пикселей для обычного отображения или 32x32 пикселя для отображения высокой плотности. Чтобы избежать масштабирования, вы можете указать значки следующим образом:

"icons": {
        "16": "path/to/geo-16.png",
        "32": "path/to/geo-32.png"
      }

Также можно указать один SVG-значок, и он будет масштабироваться соответствующим образом:

"icons": {
        "16": "path/to/geo.svg"
      }

Примечание: Верхний уровень пункта меню использует значки icons, указанные в манифесте, а не те, что указаны с этим ключом.

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

string. Уникальный идентификатор, который нужно назначить этому элементу. Обязателен для неперсистентных страниц фона (событий) в Manifest V2 и в Manifest V3. Не может быть таким же, как у другого идентификатора этого расширения.

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

function. Функция, которая будет вызвана при нажатии на пункт меню. Страницы событий не могут использовать это: вместо этого они должны зарегистрировать обработчик для menus.onClicked.

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

integer или string. Идентификатор родительского пункта меню; это делает элемент дочерним по отношению к ранее добавленному элементу. Примечание: если вы создали более одного пункта меню, элементы будут размещены в подменю. Родитель подменю будет помечен названием расширения.

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

array string. Аналогично documentUrlPatterns, но позволяет фильтровать по href тегов anchor и src атрибуту тегов img/audio/video. Этот параметр поддерживает любые схемы URL, даже те, которые обычно не допускаются в шаблоне сопоставления.

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

string. Текст, который будет отображаться в элементе. Обязательно, если type не "separator".

Вы можете использовать "%s" в строке. Если вы сделаете это в пункте меню, и некоторый текст выделен на странице при отображении меню, тогда выделенный текст будет интерполирован в заголовок. Например, если title равно "Перевести '%s' на язык Pig Latin", а пользователь выбирает слово "cool", затем активирует меню, тогда заголовок пункта меню будет: "Перевести 'cool' на язык Pig Latin".

Если заголовок содержит амперсанд "&", то следующий символ будет использоваться в качестве клавиши доступа для элемента, а амперсанд не будет отображаться. Исключение составляют:

  • Если следующий символ также является амперсандом: тогда будет отображаться один амперсанд и никакая клавиша доступа не будет установлена. По сути, "&&" используется для отображения одного амперсанда.
  • Если следующие символы — это директива интерполяции "%s": тогда амперсанд не будет отображаться, и никакая клавиша доступа не будет установлена.
  • Если амперсанд является последним символом в заголовке: тогда амперсанд не будет отображаться, и никакая клавиша доступа не будет установлена.

Только первый амперсанд будет использован для установки клавиши доступа: последующие амперсанды не будут отображаться, но не будут устанавливать клавиши. Так "&A и &B" будет отображаться как "A и B" и установит "A" в качестве клавиши доступа.

В некоторых локализованных версиях Firefox (японская и китайская), клавиша доступа окружена скобками и добавлена к метке пункта меню, если только сама метка пункта меню не заканчивается на клавише доступа ("toolkit(&K)" например). Для получения более подробной информации см. ошибку Firefox 1647373.

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

menus.ItemType. Тип пункта меню: "normal", "checkbox", "radio", "separator". По умолчанию "normal".

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

extension.ViewType. Список типов представлений, в которых будет отображаться пункт меню. По умолчанию любое представление, включая те, у которых нет viewType.

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

boolean. Отображается ли элемент в меню. По умолчанию true.

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

function. Вызывается, когда элемент был создан. Если при создании элемента возникли проблемы, подробности будут доступны в runtime.lastError.

Возвращаемое значение

integer или string. ID вновь созданного элемента.

Примеры

В этом примере создаётся элемент контекстного меню, который отображается, когда пользователь выбрал текст на странице. Он просто записывает выделенный текст в консоль:

browser.menus.create({
  id: "log-selection",
  title: "Log '%s' to the console",
  contexts: ["selection"]
});

browser.menus.onClicked.addListener((info, tab) => {
  if (info.menuItemId === "log-selection") {
    console.log(info.selectionText);
  }
});

В этом примере добавляются два пункта переключателя, которые вы можете использовать для выбора применения зелёной или синей границы к странице. Обратите внимание, что этому примеру потребуется разрешение activeTab.

function onCreated() {
  if (browser.runtime.lastError) {
    console.log("error creating item:", browser.runtime.lastError);
  } else {
    console.log("item created successfully");
  }
}

browser.menus.create({
  id: "radio-green",
  type: "radio",
  title: "Make it green",
  contexts: ["all"],
  checked: false
}, onCreated);

browser.menus.create({
  id: "radio-blue",
  type: "radio",
  title: "Make it blue",
  contexts: ["all"],
  checked: false
}, onCreated);

let makeItBlue = 'document.body.style.border = "5px solid blue"';
let makeItGreen = 'document.body.style.border = "5px solid green"';

browser.menus.onClicked.addListener((info, tab) => {
  if (info.menuItemId === "radio-blue") {
    browser.tabs.executeScript(tab.id, {
      code: makeItBlue
    });
  } else if (info.menuItemId === "radio-green") {
    browser.tabs.executeScript(tab.id, {
      code: makeItGreen
    });
  }
});

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

  • menu-accesskey-visible
  • menu-demo
  • menu-labelled-open
  • menu-remove-element
  • menu-search
  • session-state

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

Рабочий стол Мобильное устройство
Chrome Edge Firefox Internet Explorer Opera Safari WebView Android Chrome Android Firefox for Android Opera Android Safari на IOS Samsung Internet
create
ДаЭлементы, которые не указывают «контексты», не наследуют контексты от своих родителей.
ДаЭлементы, которые не указывают «контексты», не наследуют контексты от своих родителей.
55
48До версии 53, элементы, которые не указывают «контексты», не наследуют контексты от своих родителей.
?
ДаЭлементы, которые не указывают «контексты», не наследуют контексты от своих родителей.
14Элементы, которые не указывают «контексты», не наследуют контексты от своих родителей.
? ? Нет ? Нет ?
accessKey Да Да 63 ? Да
14Safari удаляет & из отображаемых заголовков элементов меню, но не поддерживает вызов элементов меню с помощью клавиш доступа.
? ? Нет ? Нет ?
command Нет Нет 55 ? Нет Нет ? ? Нет ? Нет ?
icons Нет Нет 56 ? Нет Нет ? ? Нет ? Нет ?
visible 62 79 63 ? 49 14 ? ? Нет ? Нет ?

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

Spec-Zone.ru

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