如何更改 Firefox 上下文菜单的键盘快捷键?

如何更改 Firefox 上下文菜单的键盘快捷键?

我正在尝试更改 Firefox 中显示上下文菜单的键盘快捷键(相当于Shift-F10在 Linux 或 Windows 或Control-SpaceOS 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);

相关内容