2016-11-12 4 views
0

Gibt es eine Möglichkeit, einen der Art contextMenu auszuschließen, wenn sie sich überschneiden?
Beispiel:
Ich habe zwei Kontextelemente, editierbar und Auswahl.
In der Situation, wenn beide dieser Typen übereinstimmen, (Auswahl innerhalb editierbar)chrome.contextMenus exclude type

enter image description here

Chrome für beide Aktionen Untermenü gibt.
Ich möchte nur einen haben.
Wie kann ich einen dieser Typen in dieser speziellen Situation priorisieren oder ausschließen?

+2

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? –

+0

@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 –

Antwort

1

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.

+0

Danke Rob. Ich glaube, das ist der einzige Weg, um es zu erreichen (und somit akzeptierte Antwort), aber ist für meine Bedürfnisse übertrieben. Ich werde es so lassen wie es ist (mit Untermenüs Version). –