Spec-Zone.ru › Web Extensions

menus.onShown

Вызывается, когда браузер отобразил меню.

Расширение может использовать это событие для обновления элементов меню с помощью информации, доступной только после отображения меню. Обычно расширение определит обновление в обработчике onShown и затем вызовет menus.refresh() для обновления самого меню.

Обработчик может добавлять, удалять или обновлять элементы меню.

Например, расширение menu-labelled-open добавляет элемент меню, который отображается, когда пользователь нажимает на ссылку, и при нажатии просто открывает ссылку. Оно использует onShown и refresh() для аннотации элемента меню именем хоста ссылки, чтобы пользователь мог легко увидеть, куда он перейдёт, прежде чем нажать.

Обратите внимание, что расширение не должно тратить слишком много времени, прежде чем вызывать refresh(), или обновление будет заметно для пользователя.

Обработчик получает некоторую информацию о меню и его содержимом, а также некоторые данные со страницы (например, ссылку и/или текст выделения). Для доступа к информации со страницы ваше расширение должно иметь разрешение host permission для неё.

Если обработчик onShown вызывает любые асинхронные API, то возможно, что меню было закрыто ещё раз, прежде чем обработчик возобновит выполнение. Из-за этого, если обработчик вызывает асинхронные API, он должен проверить, отображается ли меню до обновления меню. Например:

let lastMenuInstanceId = 0;
let nextMenuInstanceId = 1;

browser.menus.onShown.addListener(async (info, tab) => {
  let menuInstanceId = nextMenuInstanceId++;
  lastMenuInstanceId = menuInstanceId;

  // Call an async function
  await /* the function to call */ ;

  // After completing the async operation, check whether the menu is still shown.
  if (menuInstanceId !== lastMenuInstanceId) {
    return; // Menu was closed and shown again.
  }
  // Now use menus.create/update + menus.refresh.
});

browser.menus.onHidden.addListener(() => {
  lastMenuInstanceId = 0;
});

Обратите внимание, что можно вызвать функции API меню синхронно, и в этом случае вам не нужно выполнять эту проверку:

browser.menus.onShown.addListener(async (info, tab) => {
  browser.menus.update(menuId /*, …*/);
  // Note: Not waiting for returned promise.
  browser.menus.refresh();
});

Однако, если вы вызываете эти API асинхронно, тогда вам нужно выполнить проверку:

browser.menus.onShown.addListener(async (info, tab) => {
  let menuInstanceId = nextMenuInstanceId++;
  lastMenuInstanceId = menuInstanceId;

  await browser.menus.update(menuId /*, …*/);
  // must now perform the check
  if (menuInstanceId !== lastMenuInstanceId) {
    return;
  }
  browser.menus.refresh();
});

Firefox предоставляет это событие через пространство имён contextMenus , а также через пространство имён menus.

Синтаксис

browser.menus.onShown.addListener(listener)
browser.menus.onShown.removeListener(listener)
browser.menus.onShown.hasListener(listener)

События имеют три функции:

addListener(listener)

Добавляет обработчик к этому событию.

removeListener(listener)

Прекращает прослушивание этого события. Аргумент listener — это обработчик для удаления.

hasListener(listener)

Проверяет, зарегистрирован ли listener для этого события. Возвращает true если он прослушивает, false в противном случае.

Синтаксис addListener

Параметры

callback

Функция, которая будет вызвана при возникновении этого события. Функция получит следующие аргументы:

info

Object. Это аналогично объекту menus.OnClickData, за исключением двух дополнительных свойств:

  • contexts: массив всех contexts, которые применимы к этому меню.
  • menuIds: массив идентификаторов всех элементов меню, принадлежащих этому расширению, которые отображаются в этом меню.

По сравнению с menus.OnClickData, объект info также опускает свойства menuItemId и modifiers, потому что, конечно, они недоступны, пока элемент меню не выбран.

Свойства contexts, menuIds, frameId, и editable всегда предоставляются. Все другие свойства в info предоставляются только если у расширения есть разрешение host permission для страницы.

tab

tabs.Tab. Детали вкладки, где произошёл клик. Если клик не произошёл в или на вкладке, этот параметр будет отсутствовать.

Примеры

В этом примере прослушивается событие отображения контекстного меню над ссылкой, а затем обновляется элемент меню openLabelledId с именем хоста ссылки:

function updateMenuItem(linkHostname) {
  browser.menus.update(openLabelledId, {
    title: `Open (${linkHostname})`,
  });
  browser.menus.refresh();
}

browser.menus.onShown.addListener((info) => {
  if (!info.linkUrl) {
    return;
  }
  let linkElement = document.createElement("a");
  linkElement.href = info.linkUrl;
  updateMenuItem(linkElement.hostname);
});

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

  • menu-labelled-open

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

Рабочий стол Мобильные
Chrome Edge Firefox Internet Explorer Opera Safari WebView Android Chrome Android Firefox for Android Opera Android Safari на IOS Samsung Internet
onShown Нет Нет 6060 ? Нет Нет ? ? Нет ? Нет ?

© 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/onShown

Spec-Zone.ru

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