根据点击的元素更改上下文菜单文本

时间:2017-03-02 19:07:39

标签: javascript google-chrome-extension

我已经构建了Chrome扩展程序(https://chrome.google.com/webstore/detail/omnibear/cjieakdeocmiimmphkfhdfbihhncoocn)。它在上下文菜单中添加了一个项目,因此用户可以右键单击页面上的元素并回复其博客上的相关“条目”。

我的问题是,我是否能找到“条目”取决于他们点击的位置,并涉及遍历DOM树。我有代码,在contextmenu事件被触发时突出显示条目,但是在上下文菜单中更新文本为时已晚。有没有办法在打开时动态更新上下文菜单文本?

(例如,如果没有找到条目,我想说“回复页面”,或者如果发现推文,则“回复推文”)

1 个答案:

答案 0 :(得分:0)

不,在Chrome扩展程序/ Firefox WebExtension中,无法让您的JavaScript在上下文菜单打开时对上下文菜单进行动态更改。在上下文菜单打开时唯一动态更改 的是:如果您添加了一个上下文菜单项,其selection的{​​{1}}上下文,那么您可以ContextType,将替换为当前选择。

在开始打开之前更改上下文菜单

鼠标事件

要执行您想要的操作,您需要在打开上下文菜单开始之前对上下文菜单进行更改。这可以通过使用specify %s in the title来监听content script事件来实现。您可能必须最终使用mouseup事件,或mousedown / mouseenter / mouseleave / mouseover个事件中的一个或多个。如果您确实需要使用mousedown,那么一旦该事件触发,您应该开始收听一些mouseenter / mouseleave / mouseover / mouseout个事件。告诉鼠标结束的元素何时发生变化,或者只是假设用户释放按下它的同一元素上的按钮。

如果mouseup / mousedown事件适用于button=2,则您需要mouseout更改上下文菜单message your background script。此过程有多个异步部分。这可能会导致各种竞争条件,并且可能需要使用比mouseup提供早期通知的事件(例如mousedownmouseenter / mouseleave / mouseover / mouseout)。

您需要注意哪些事件可能取决于操作系统/平台/窗口系统。您需要进行测试以确定您计划支持的每个环境中需要什么。

键盘事件

也可以使用一些键盘序列打开上下文菜单。您将需要监听并执行鼠标事件所需的相同消息传递。您需要确定这些事件在您支持的所有操作系统/平台/窗口系统中的作用。

的Linux

在Linux上,它显示为contextMenus.update()

OSX

在OSX上,似乎是vary at least based on platform

在Windows上,打开上下文菜单的键盘快捷键为:

上下文菜单键

您需要检测以下事件序列:

keydown { target: <body>, key: "ContextMenu", charCode: 0, keyCode: 93 }
keypress { target: <body>, key: "ContextMenu", charCode: 0, keyCode: 93 }
keyup { target: <body>, key: "ContextMenu", charCode: 0, keyCode: 93 }

keyup事件触发的同时,上下文菜单才会打开。我没有测试keyup是否发生得足够早,以便在打开之前对上下文菜单进行更改。

键盘组合: Shift - F10

您需要检测以下事件序列:

keydown Shift { target: <body>, key: "Shift", charCode: 0, keyCode: 16, shiftKey: true }
keydown Shift { target: <body>, key: "F10", charCode: 0, keyCode: 121, shiftKey: true }
keypress Shift { target: <body>, key: "F10", charCode: 0, keyCode: 121, shiftKey: true }

在这种情况下,上下文菜单会在移动的 F10 keydown / keypress事件触发的同时打开。此键盘序列不会触发keyup个事件。