Javascript 按下numpad时释放Shift键

Javascript 按下numpad时释放Shift键,javascript,keyboard-events,Javascript,Keyboard Events,添加键盘侦听器: document.addEventListener("keydown", e=>console.log('keydown', e.code), true); document.addEventListener("keyup", e=>console.log('keyup', e.code), true); 按Shift+Num1: keydown ShiftLeft keyup ShiftLeft keydown Numpad1 keyup Numpad1 key

添加键盘侦听器:

document.addEventListener("keydown", e=>console.log('keydown', e.code), true);
document.addEventListener("keyup", e=>console.log('keyup', e.code), true);
按Shift+Num1:

keydown ShiftLeft
keyup ShiftLeft
keydown Numpad1
keyup Numpad1
keydown ShiftLeft
keyup ShiftLeft
为什么在发送numpad键之前不进行移位?这是一个Chrome bug吗

document.addEventListener(“keydown”,e=>console.log('keydown',e.code,e.shiftKey)),true;

document.addEventListener(“keyup”,e=>console.log('keyup',e.code,e.shiftKey)),true似乎Shift会覆盖Windows中的numlock并导致这种行为。铬与此无关


此行为是windows的一项功能/怪癖

如果要捕获shift numpad事件,可以执行以下操作:

  • 释放shift键时保存时间戳
  • 在您的按键事件中,检查这是多久以前的事了。如果小于50毫秒左右,则很可能是用户按下了shift+numpad键(而不是箭头键)

    让iShiftReleaseTime;
    $(文档).keyup(函数(e){
    如果(e.keyCode==16)//移位键
    iShiftReleaseTime=Date.now();
    });
    $(文档).keydown(函数(e){
    如果((Date.now()-iShiftReleaseTime)<50){
    如果(e.keyCode==45)console.log(“按下Shift+Numpad 0”);
    如果(e.keyCode==35)console.log(“按下Shift+numpad1”);
    如果(e.keyCode==40)console.log(“按下Shift+numpad2”);
    如果(e.keyCode==34)console.log(“按下Shift+numpad3”);
    如果(e.keyCode==37)console.log(“按下Shift+Numpad 4”);
    如果(e.keyCode==12)console.log(“按下Shift+numpad5”);
    如果(e.keyCode==39)console.log(“按下Shift+Numpad 6”);
    如果(e.keyCode==36)console.log(“按下Shift+Numpad 7”);
    如果(e.keyCode==38)console.log(“按下Shift+Numpad 8”);
    如果(e.keyCode==33)console.log(“按下Shift+numpad9”);
    }
    否则{
    如果(e.keyCode==37)console.log(“按下了左箭头键”);
    如果(e.keyCode==38)console.log(“按下了向上箭头键”);
    如果(e.keyCode==39)console.log(“按了右箭头键”);
    如果(e.keyCode==40)console.log(“按下向下箭头键”);
    //等等。。。
    }
    });
    

  • 您需要检查
    e.shiftKey
    以捕捉组合。我不知道为什么它先进行键控。它是
    false
    。顺便说一下,
    key
    被设置为
    End
    ,所以它为我做了一些奇怪的翻译。我只想处理shift+num1…
    e。当我按下shift+num1时,shiftKey
    对我来说是真的。我刚刚测试过。我似乎无法复制这种行为,而且我也在使用Chrome,这可能是你键盘上的东西吗?(Chrome 73.0.3683.86版)你试过使用numlock吗?
    let iShiftReleaseTime;
    
    $(document).keyup(function (e) {
        if(e.keyCode == 16) //shift key
            iShiftReleaseTime = Date.now();
    });
    
    $(document).keydown(function (e) {
        if ((Date.now() - iShiftReleaseTime) < 50) {
            if (e.keyCode == 45) console.log("Shift + Numpad 0 was pressed");
            if (e.keyCode == 35) console.log("Shift + Numpad 1 was pressed");
            if (e.keyCode == 40) console.log("Shift + Numpad 2 was pressed");
            if (e.keyCode == 34) console.log("Shift + Numpad 3 was pressed");
            if (e.keyCode == 37) console.log("Shift + Numpad 4 was pressed");
            if (e.keyCode == 12) console.log("Shift + Numpad 5 was pressed");
            if (e.keyCode == 39) console.log("Shift + Numpad 6 was pressed");
            if (e.keyCode == 36) console.log("Shift + Numpad 7 was pressed");
            if (e.keyCode == 38) console.log("Shift + Numpad 8 was pressed");
            if (e.keyCode == 33) console.log("Shift + Numpad 9 was pressed");
        }
        else {
            if (e.keyCode == 37) console.log("left arrow key was pressed");
            if (e.keyCode == 38) console.log("up arrow key was pressed");
            if (e.keyCode == 39) console.log("right arrow key was pressed");
            if (e.keyCode == 40) console.log("down arrow key was pressed");
            //etc...
        }
    });