我正在尝试更改用于在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);
我发现以前在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);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句