Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Shift key released when pressing numpad

Add keyboard listeners:

document.addEventListener("keydown", e=>console.log('keydown', e.code), true);
document.addEventListener("keyup", e=>console.log('keyup', e.code), true);

Press Shift+Num1:

keydown ShiftLeft
keyup ShiftLeft
keydown Numpad1
keyup Numpad1
keydown ShiftLeft
keyup ShiftLeft

Why is it unpressing Shift before sending numpad key? Is it a 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);
like image 354
riv Avatar asked Feb 25 '26 13:02

riv


2 Answers

It seems that Shift overrides numlock in Windows and results in this behavior. Chrome has nothing to do with it.

https://devblogs.microsoft.com/oldnewthing/20040906-00/?p=37953

like image 160
riv Avatar answered Feb 27 '26 04:02

riv


This behavior is a windows feature/quirk.

Here is what you can do if you want to capture shift-numpad events:

  1. Save the timestamp when the shift key is released

  2. In you keydown event check how long ago that was. If less than 50ms or so, it is very likely that the user pressed shift + a numpad key (and not the arrow keys).

    let iShiftReleaseTime;
    
    window.addEventListener('keyup', function (e) {
        if(e.keyCode == 16) //shift key
            iShiftReleaseTime = Date.now();
    });
    
    window.addEventListener('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...
        }
    });
    
like image 38
Jan Feldmann Avatar answered Feb 27 '26 04:02

Jan Feldmann



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!