检测 JavaScript 中的箭头键按下

IT技术 javascript keypress keyboard-events
2021-02-05 12:45:41

如何检测何时按下了其中一个箭头键?我用这个来找出:

function checkKey(e) {
    var event = window.event ? window.event : e;
    console.log(event.keyCode)
}

虽然它适用于所有其他键,但它不适用于箭头键(可能是因为浏览器默认应该在这些键上滚动)。

6个回答

箭头键只能由 触发onkeydown,而不是由 触发onkeypress

密钥代码是:

  • 左 = 37
  • 向上 = 38
  • 右 = 39
  • 向下 = 40
某些浏览器确实会触发keypress箭头键的事件,但您是对的,keydown始终适用于箭头键。
2021-03-11 12:45:41
@zyklus 我昨晚读错了。我以为它说的是“或”。对不起,我删除了我的评论。
2021-03-17 12:45:41
如果你按 %,你也会得到 keyCode 37
2021-03-19 12:45:41
@xorcus -- 不,您会53参加keydown活动。37keypress,这是一个不同的事情
2021-03-27 12:45:41
@MrCroft - 或者也可以onkeyup在那里收听并停止活动。但是,实际上您不应该使用 Javascript 修改 UI 行为。
2021-04-08 12:45:41

上键上下调用功能。每个键都有不同的代码。

document.onkeydown = checkKey;

function checkKey(e) {

    e = e || window.event;

    if (e.keyCode == '38') {
        // up arrow
    }
    else if (e.keyCode == '40') {
        // down arrow
    }
    else if (e.keyCode == '37') {
       // left arrow
    }
    else if (e.keyCode == '39') {
       // right arrow
    }

}
@ketan 重点是 keyCode 是一个数字,应该像keyCode === 32、 不是keyCode == '32'一样检查keyCode === '32'
2021-03-14 12:45:41
为了澄清,'e || window.event' 表示如果 'e' 是一个定义的值,它将是 '||' 的结果 表达。如果未定义 'e',则 'window.event' 将是 '||' 的结果 表达。所以它基本上是: e = e ? e : window.event; 或:if (typeof(e) === "undefined") { e = window.event; }
2021-03-19 12:45:41
只是要注意 keyCode 是一个数字,理想情况下应该使用 ===
2021-03-23 12:45:41
这是为了使其在事件未传递到处理程序函数的旧版本 IE(IE9 之前)上工作。
2021-03-31 12:45:41
第二行有什么作用?
2021-04-02 12:45:41

event.key === "ArrowRight"...

更新更干净:使用event.key. 没有更多的任意数字代码!如果您正在转译或知道您的用户都在使用现代浏览器,请使用它!

node.addEventListener('keydown', function(event) {
    const key = event.key; // "ArrowRight", "ArrowLeft", "ArrowUp", or "ArrowDown"
});

详细处理:

switch (event.key) {
    case "ArrowLeft":
        // Left pressed
        break;
    case "ArrowRight":
        // Right pressed
        break;
    case "ArrowUp":
        // Up pressed
        break;
    case "ArrowDown":
        // Down pressed
        break;
}

现代开关处理:

const callback = {
    "ArrowLeft"  : leftHandler,
    "ArrowRight" : rightHandler,
    "ArrowUp"    : upHandler,
    "ArrowDown"  : downHandler,
}[event.key]
callback?.()

注意:旧属性(.keyCode.which)已弃用。

"w", "a", "s", "d" 方向,使用 event.code

为了支持使用非 qwerty/英文键盘布局的用户,您应该使用event.code. 这将保留物理密钥位置,即使由此产生的字符更改也是如此。

event.key,在 Dvorak 和zAzerty 上,使您的游戏无法播放。

const {code} = event
if (code === "KeyW") // KeyA, KeyS, KeyD

最理想的情况是,您还允许重新映射密钥,无论玩家处于何种情况,这都会使他们受益。

PSevent.code箭头相同

key Mozilla 文档

code Mozilla 文档

支持的浏览器

MDN 注释:Internet Explorer、Edge(16 及更早版本)和 Firefox(36 及更早版本)使用“Left”、“Right”、“Up”和“Down”而不是“ArrowLeft”、“ArrowRight”、“ArrowUp” ”,和“向下箭头”。
2021-03-16 12:45:41
由于 event.keyCode 已弃用,这应该是公认的答案
2021-04-02 12:45:41
感谢您使用keyand not keyCode,这已被弃用。
2021-04-03 12:45:41

可能是最简洁的公式:

document.onkeydown = function(e) {
    switch (e.keyCode) {
        case 37:
            alert('left');
            break;
        case 38:
            alert('up');
            break;
        case 39:
            alert('right');
            break;
        case 40:
            alert('down');
            break;
    }
};

演示(感谢用户 Angus Grant):http : //jsfiddle.net/angusgrant/E3tE6/

这应该跨浏览器工作。如果有浏览器不起作用,请发表评论。

还有其他方法可以获取关键代码(e.which、e.charCode 和 window.event 而不是 e),但它们不是必需的。您可以在http://www.asquare.net/javascript/tests/KeyCode.html 上尝试其中的大部分请注意 event.keycode 不适用于 Firefox 中的 onkeypress,但它适用于 onkeydown。

我不得不仰视的定义简洁,那么我(sprightfully)推测tersest是不恰当的结合; 唉,我承认:我的关心是可以反驳的
2021-04-06 12:45:41

使用keydown, 不适keypress用于不可打印的键,例如箭头键:

function checkKey(e) {
    e = e || window.event;
    alert(e.keyCode);
}

document.onkeydown = checkKey;

我找到的最好的 JavaScript 关键事件参考(例如,在 quirksmode 下大吃一惊)在这里:http : //unixpapa.com/js/key.html

现在keypress已被标记为已弃用
2021-04-06 12:45:41