Wenn die Menüelementtypen identisch sind (d. H. Gleicher Typ, Typ usw.), können Sie das Kontextmenü deklarieren und mehrere Kontexte angeben. Dann wird der Menüeintrag angezeigt, wenn einer der Kontexte übereinstimmt.
Sie haben jedoch festgestellt, dass Sie separate Kontextmenü Erklärungen wirklich brauchen:
- Menüpunkt mit dem Titel „Notieren“ für die „Auswahl“ Kontext.
- Menüpunkt mit dem Titel "Notiz einfügen" für den "editierbaren" Kontext.
- Menüelement mit Titel "Notiz", wenn beide Kontexte gelten, z. wenn Text in einem Eingabefeld ausgewählt wird (also ohne den Menüpunkt "Notiz einfügen").
Die API contextMenus
unterstützt diesen Anwendungsfall nicht direkt. Die nächstbeste Alternative ist also, das Kontextmenü für die "bearbeitbar" zu entfernen, bevor das Kontextmenü in der dritten Situation erscheint (und das Kontextmenü wiederherzustellen, wenn die dritte Situation nicht länger relevant ist).
In Ihrer Situation würde ich selectionchange
verwenden, um festzustellen, wenn der Benutzer (de) Text auswählt. Nachdem Sie einen Text ausgewählt haben, prüfen Sie, ob ein Eingabefeld in der Auswahl enthalten ist (Sie können dazu die APIs Selection
, Range
und/oder DOM (Traversal) kombinieren). Wenn Sie ein Eingabefeld finden, entfernen Sie den gewünschten Kontextmenüeintrag. Unabhängig davon, ob Sie einen Menüeintrag finden, fügen Sie Listener für Schlüssel- und/oder Mausereignisse hinzu, um festzustellen, ob sich der Zeiger des Benutzers in einem Eingabefeld befindet.
Hier ist ein Beispiel, das selectionchange
(https://stackoverflow.com/a/13673942/938089) und ein anderes für Showing context menu buttons only when right-clicked on classes that start with “Story” verwendet.
Es wird nur ein Menüeintrag angezeigt, wenn Sie die beiden zu einem Aufruf 'chrome.contextMenus.create' kombinieren. Ist das eine Option für dich? –
@RobW nein, leider brauche ich verschiedene Aktionen für diese beiden. Nur in der Situation, wenn sie sich überschneiden, will ich ** notieren **, um Vorrang zu haben http://prntscr.com/d6gc24 –