menus.onShown
Wird ausgelöst, wenn der Browser ein Menü angezeigt hat.
Eine Erweiterung kann dieses Ereignis nutzen, um ihre Menüelemente mit Informationen zu aktualisieren, die erst verfügbar sind, wenn das Menü angezeigt wird. Typischerweise ermittelt eine Erweiterung das Update in ihrem onShown-Handler und ruft dann menus.refresh() auf, um das Menü selbst zu aktualisieren.
Der Handler kann Menüeinträge hinzufügen, entfernen oder aktualisieren.
Das Beispiel der Erweiterung menu-labelled-open fügt einen Menüpunkt hinzu, der angezeigt wird, wenn der Benutzer auf einen Link klickt, und der, wenn angeklickt, einfach den Link öffnet. Es verwendet onShown und refresh(), um den Menüpunkt mit dem Hostnamen des Links zu versehen, damit der Benutzer leicht sehen kann, wohin er gelangen wird, bevor er klickt.
Beachten Sie, dass eine Erweiterung nicht zu viel Zeit verstreichen lassen sollte, bevor sie refresh() aufruft, da das Update für den Benutzer erkennbar wird.
Der Handler erhält einige Informationen über das Menü und dessen Inhalte sowie einige Informationen von der Seite (wie den Link und/oder den ausgewählten Text). Um auf die Informationen von der Seite zugreifen zu können, muss Ihre Erweiterung die Host-Berechtigung dafür haben.
Wenn der onShown-Handler asynchrone APIs aufruft, kann es passieren, dass das Menü wieder geschlossen ist, bevor der Handler die Ausführung wieder aufnimmt. Aus diesem Grund sollte ein Handler, wenn er asynchrone APIs aufruft, überprüfen, ob das Menü noch angezeigt wird, bevor es aktualisiert wird. Zum Beispiel:
let lastMenuInstanceId = 0;
let nextMenuInstanceId = 1;
browser.menus.onShown.addListener(async (info, tab) => {
let menuInstanceId = nextMenuInstanceId++;
lastMenuInstanceId = menuInstanceId;
// Call an async function
await doSomethingAsync();
// 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;
});
Beachten Sie, dass es möglich ist, menus API-Funktionen synchron aufzurufen, und in diesem Fall müssen Sie diese Überprüfung nicht durchführen:
browser.menus.onShown.addListener(async (info, tab) => {
browser.menus.update(menuId /*, … */);
// Note: Not waiting for returned promise.
browser.menus.refresh();
});
Wenn Sie diese APIs jedoch asynchron aufrufen, müssen Sie die Überprüfung durchführen:
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 stellt dieses Ereignis sowohl über den contextMenus-Namensraum als auch über den menus-Namensraum zur Verfügung.
Syntax
browser.menus.onShown.addListener(listener)
browser.menus.onShown.removeListener(listener)
browser.menus.onShown.hasListener(listener)
Events haben drei Funktionen:
addListener(listener)-
Fügt diesem Ereignis einen Listener hinzu.
removeListener(listener)-
Beendet das Lauschen auf dieses Ereignis. Das Argument
listenerist der zu entfernende Listener. hasListener(listener)-
Überprüfen, ob
listenerfür dieses Ereignis registriert ist. Gibttruezurück, wenn es zuhört, sonstfalse.
addListener-Syntax
>Parameter
listener-
Die Funktion, die aufgerufen wird, wenn dieses Ereignis eintritt. Der Funktion werden diese Argumente übergeben:
info-
Object. Dies ist ähnlich wie das Objektmenus.OnClickData, enthält jedoch zwei zusätzliche Eigenschaften:contexts: ein Array allerKontexte, die für dieses Menü zutreffen.menuIds: ein Array von IDs aller Menüelemente, die zu dieser Erweiterung gehören und in diesem Menü angezeigt werden.
Im Vergleich zu
menus.OnClickDatalässt dasinfo-Objekt auch die EigenschaftenmenuItemIdundmodifiersaus, da diese natürlich erst verfügbar sind, wenn ein Menüelement ausgewählt wurde.Die Eigenschaften
contexts,menuIds,frameIdundeditablewerden immer bereitgestellt. Alle anderen Eigenschaften ininfowerden nur bereitgestellt, wenn die Erweiterung die Host-Berechtigung für die Seite hat. tab-
tabs.Tab. Die Details des Tabs, in dem der Klick stattfand. Wenn der Klick nicht in oder auf einem Tab stattfand, fehlt dieser Parameter.
Beispiele
Dieses Beispiel hört darauf, dass das Kontextmenü über einem Link angezeigt wird, und aktualisiert dann das Menüelement openLabelledId mit dem Hostnamen des Links:
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);
});