Check if a key is down?
Is there a way to detect if a key is currently down in JavaScript?
I know about the "keydown" event, but that's not what I need. Some time AFTER the key is pressed, I want to be able to detect if it is still pressed down.
P. S. The biggest issue seems to be that after some period of time the key begins to repeat, firing off keydown and keyup events like a fiend. Hopefully there is just a simple isKeyDown(key) function, but if not then this issue will need to be overcome / worked around.
In addition to using keyup
and keydown
listeners to track when is key goes down and back up, there are actually some properties that tell you if certain keys are down.
window.onmousemove = function (e) {
if (!e) e = window.event;
if (e.shiftKey) {/*shift is down*/}
if (e.altKey) {/*alt is down*/}
if (e.ctrlKey) {/*ctrl is down*/}
if (e.metaKey) {/*cmd is down*/}
}
This are available on all browser generated event objects, such as those from keydown
, keyup
, and keypress
, so you don't have to use mousemove.
I tried generating my own event objects with document.createEvent('KeyboardEvent')
and document.createEvent('KeyboardEvent')
and looking for e.shiftKey
and such, but I had no luck.
I'm using Chrome 17 on Mac
Is there a way to detect if a key is currently down in JavaScript?
Nope. The only possibility is monitoring each keyup
and keydown
and remembering.
after some period of time the key begins to repeat, firing off keydown and keyup events like a fiend.
It shouldn't. You'll definitely get keypress
repeating, and in many browsers you'll also get repeated keydown
, but if keyup
repeats, it's a bug.
Unfortunately it is not a completely unheard-of bug: on Linux, Chromium, and Firefox (when it is being run under GTK+, which it is in popular distros such as Ubuntu) both generate repeating keyup-keypress-keydown sequences for held keys, which are impossible to distinguish from someone hammering the key really fast.
My solution:
var pressedKeys = {};
window.onkeyup = function(e) { pressedKeys[e.keyCode] = false; }
window.onkeydown = function(e) { pressedKeys[e.keyCode] = true; }
I can now check if any key is pressed anywhere else in the script by checking
pressedKeys["code of the key"]
If it's true, the key is pressed.
I don't believe there is anything like an isKeyDown function, but you could write your own.
Basically, create an array whose length is the number of keys you want to monitor. Then using the documents/pages/controls keyUp and keyDown events, update the array with that key's state.
Then write a function that checks if a certain key is down and returns a bool.
var keyEnum = { W_Key:0, A_Key:1, S_Key:2, D_Key:3 };
var keyArray = new Array(4);
function onKeyDown()
{
// Detect which key was pressed
if( key == 'w' )
keyArray[keyEnum.W_Key] = true;
// Repeat for each key you care about...
}
function onKeyUp()
{
// Detect which key was released
if( key == 'w' )
keyArray[keyEnum.W_Key] = false;
// Repeat for each key you care about...
}
function isKeyDown(key)
{
return keyArray[key];
}
That should accomplish what you want.