【发布时间】:2020-10-12 21:38:46
【问题描述】:
我目前正在尝试将用户提供的键盘组合转换为其可打印版本(例如,如果用户按下 shift + a,我希望能够检测到它并在某处打印字符串“shift + a”,以便用户知道他与操作相关联的组合。
到目前为止,我一直在使用提供的布尔值:ctrlKey、altKey、shiftKey 和 metaKey,当它们为真时,我将它们的可打印版本添加到最终字符串中。
它在某种程度上......在某种程度上......
我正确收到了 ctrl 标志,但是 shift 标志不稳定(在不应该换班的时候不给班次,但在应该换班的时候不给班次,尽管它对某些键工作正常)并且 alt 标志似乎只对少数几个有效键和元标志似乎根本不起作用。 请注意,我的键盘工作正常,也就是说,这些键在正常情况下按预期工作(shift 键允许我大写,win 键允许我锁定我的计算机,等等...) 另请注意,我的键盘是 azerty。
它在 W3schools 示例中的行为方式相同:
https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_event_key_shiftkey
这是一个例子:
trying with &, which does not require shift on an azerty
trying with 1, which does require shift on an azerty
所以我认为我在检测组合键的方式上存在一些误解。感谢所有愿意提供帮助的人。
function logKey(e) {
var modifier1;
var modifier2;
var modifier3;
var modifier4;
var display = "";
if (e.ctrlKey) {
modifier1 = "ctrl + ";
}
else {
modifier1 = "";
}
if (e.altKey) {
modifier2 = "alt + ";
}
else {
modifier2 = "";
}
if (e.shiftKey) {
modifier3 = "shift + ";
}
else {
modifier3 = "";
}
if (e.metaKey) {
modifier4 = "meta + ";
}
else {
modifier4 = "";
}
display = modifier1 + modifier2 + modifier3 + modifier4 + e.key
window.alert(display);
}
window.addEventListener('keydown', logKey);
【问题讨论】:
-
您最好保留一张已关闭的键映射(包括修饰符),而不是依赖事件信息。
-
我广泛使用了键盘事件,但从未听说过布尔值“不稳定”。但是,您使用的键盘可能正在“重新映射”
&到 shift+7(这是 QWERTY 键盘上的键盘)。 -
我在这里肯定看到了时间问题。例如,如果您只是按“Ctrl”并在几毫秒后按“A”键,您的代码将触发 two keydown 事件。 -> 这会导致你意想不到的行为。更多需要考虑 - 如果您一次或多次按 3 个键,如果您只按一个会怎样? - 有很多事情要考虑...
标签: javascript keydown