我正在尝试更改 Firefox 中显示上下文菜单的键盘快捷键(相当于Shift-F10
在 Linux 或 Windows 或Control-Space
OS X 上按下)。似乎此快捷键的处理方式与普通键盘快捷键不同(它不会显示在Keyconfig 扩展允许重新映射大多数键盘快捷键)。
我曾尝试创建按键和鼠标事件来触发上下文菜单(使用以下通过 Keyconfig 映射到快捷键的代码),但目前为止它们还没有起作用。我无法找到 Firefox 在源代码中的哪个位置处理上下文菜单的键盘快捷键,或者是否有一个我可以调用来显示它的函数。
鼠标事件:
var focused = document.commandDispatcher.focusedElement;
if(!focused) focused = document.commandDispatcher.focusedWindow.document.activeElement;
var evt = document.createEvent("MouseEvents");
evt.initMouseEvent("click", true, true, window,
0, 0, 0, 0, 0, false, false, false, false, 2, null);
focused.dispatchEvent(evt);
关键事件:
var focused = document.commandDispatcher.focusedElement;
if(!focused) focused = document.commandDispatcher.focusedWindow.document.activeElement;
var evt = document.createEvent("KeyboardEvent");
evt.initKeyEvent("keypress", true, true, null, false, false, true, false, 0x79, 0);
focused.dispatchEvent(evt);
答案1
我不是专家,但您是否尝试过在 about:config 中找到该设置?
如果没有,则在位置框中输入 about:config,然后按回车键,您将在那里找到很多设置,请告诉我您是否在那里找到任何设置。
答案2
我发现这个问题之前在 MozillaZine 上问过。该解决方案将上下文菜单放在屏幕的左上角。我尝试使用关于获取 DOM 屏幕位置的另一个问题的解决方案生成下面的代码,将上下文菜单放置在更靠近活动元素的位置,但是它仍然存在问题(有时菜单与元素有点偏离):
var target = (document.commandDispatcher.focusedElement || document.commandDispatcher.focusedWindow.document.documentElement);
var screenX=0;
var screenY=0;
if ("boxObject" in target) {
screenX=target.boxObject.x;
screenY=target.boxObject.y;
} else {
var box;
try {
box = elem.getBoundingClientRect();
} catch(e) {}
// Make sure we're not dealing with a disconnected DOM node
if (box) {
var body = document.body,
clientTop = document.documentElement.clientTop || body.clientTop || 0,
clientLeft = document.documentElement.clientLeft || body.clientLeft || 0,
scrollTop = window.pageYOffset || body.scrollTop,
scrollLeft = window.pageXOffset || body.scrollLeft,
top = box.top + scrollTop - clientTop,
left = box.left + scrollLeft - clientLeft;
}
screenX=target.offsetLeft;
screenY=target.offsetTop;
}
var e = document.createEvent("MouseEvents");
e.initMouseEvent("contextmenu", true, false, null, 0, screenX, screenY, 0, 0, false, false, false, false, 0, null);
target.dispatchEvent(e);