Как моя программа javascript может определить, какие модификаторы были нажаты вместе с событием keydown
в Chrome в Linux?
Я попробовал этот код:
document.addEventListener('keydown', function(e)
{
console.log("KEY DOWN: key=" + e.key + ", code=" + e.code
+ ", meta=" + e.metaKey + ", alt=" + e.altKey);
// stop propagation, except don't kill F12.
if (e.code != 'F12')
{
e.preventDefault(); // Windows and Firefox
e.stopPropagation();
return false;
} // else: if propagating: Windows wants undefined result.
});
И, пока он работает в Firefox:
// output when I type M-q A-q in Firefox Quantum 67.0.4 (64-bit)
KEY DOWN: key=Meta, code=OSLeft, meta=true, alt=false
KEY DOWN: key=q, code=KeyQ, meta=true, alt=false
KEY DOWN: key=Alt, code=AltLeft, meta=false, alt=true
KEY DOWN: key=q, code=KeyQ, meta=false, alt=true
Linux Chrome, похоже, требует модификатора:
// output when I type M-q A-q in Linux Chrome Version 66.0.3359.181 (Official Build) (64-bit)
KEY DOWN: key=Meta, code=MetaLeft, meta=false, alt=true
KEY DOWN: key=q, code=KeyQ, meta=false, alt=true
KEY DOWN: key=Alt, code=AltLeft, meta=false, alt=true
KEY DOWN: key=q, code=KeyQ, meta=false, alt=false
Очевидно, поля metaKey
и altKey
поля KeyboardEvent
не являются кросс-браузерными. Или я не включил функцию Chrome «клавиши-модификаторы» (как мне это сделать?). Или что-то.
Приведенный выше код прекрасно работает как в Edge, так и в Chrome в Windows. (Windows поймает ключ Windows, если это единственный модификатор, но ваше приложение может отлично ловить комбинации, такие как Ctrl-Meta-x). Например, приведенный выше код имеет одинаковый вывод как в Edge, так и в Chrome в Windows, когда я набираю C-S-M-Q A-Q:
KEY DOWN: key=Control, code=ControlLeft, meta=false, alt=false
KEY DOWN: key=Shift, code=ShiftLeft, meta=false, alt=false
KEY DOWN: key=Meta, code=MetaLeft, meta=true, alt=false
KEY DOWN: key=Q, code=KeyQ, meta=true, alt=false
KEY DOWN: key=Alt, code=AltLeft, meta=false, alt=true
KEY DOWN: key=q, code=KeyQ, meta=false, alt=true
(обратите внимание на одно небольшое различие между Chrome и Edge: Edge имеет code=undefined
. Однако в KeyboardEvent
все еще достаточно информации, чтобы определить, какая клавиша была нажата, за исключением того, что, возможно, Windows имеет некоторую проблему с сочетанием NumLock + Shift + Keypad номер).
В последний раз, когда я использовал Mac, он поддерживал клавиши Meta и Alt, поэтому вопрос, вероятно, относится и к Mac.
В Linux убедитесь, что на вашем компьютере работают мета-и Alt-ключи, так как некоторые популярные дистрибутивы выходят из коробки. Если он настроен правильно, xmodmap
должен сказать:
shift Shift_L (0x32), Shift_R (0x3e)
lock Caps_Lock (0x42)
control Control_L (0x25), Control_R (0x69)
mod1 Meta_L (0x85), Meta_R (0x86)
mod2 Num_Lock (0x4d)
mod3 Alt_L (0x40), Alt_R (0x6c)
mod4
mod5 ISO_Level3_Shift (0x5c), Mode_switch (0xcb)
потому что программы интерпретируют mod1
как Meta и mod3
как Alt. (Используйте утилиту xev
, чтобы получить коды клавиш для вашей клавиатуры.) С настройками, как показано выше, Firefox, Emacs и другие программы могут правильно перехватывать все клавиши-модификаторы.
Как правильно определить модификаторы, которые были нажаты вместе с событием keydown
в Linux Chrome?