Prevent JavaScript keydown event from being handled multiple times while held down
I have this code:
else if (e.keyCode == 32){
fired = true;
In a keyDown function (I have added the document.addEventListener code). Now it works just fine, and does exactly what I want it to do. But here's the problem: if you hold down the key, it keeps making fired = true over and over again continuously until it is released. I just want it to set fired = true; once, even if the key is held down.
Solution 1:
Edit: It is now fully supported in every browser. except for Internet Explorer
If browser compatibility is not your main concern*, you could try accessing the .repeat
property of the KeyboardEvent
, as documented here:
https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/repeat
By doing something like this in your handler function:
function keyDown (e) {
if (e.repeat) { return }
// do stuff here
}
you could avoid the repeated keystrokes.
*: on the MDN site it states that it works in Firefox, and I have successfully used it in Chrome, so the two major browsers should have no problem with it
Solution 2:
var fired = false;
element.onkeydown = function() {
if(!fired) {
fired = true;
// do something
}
};
Then Use onkeyup event
element.onkeyup = function() {
fired = false;
};
Solution 3:
Try this :)
You can determine anywhere else in your script if a key is down by simply determining if keydown
is true! You can also execute additional script when a key is down by replacing the console.log();
with whatever you want to be down when a key is down.
Please tell me if this can be improved.
var keydown = false;
window.addEventListener('keydown', function() {
if (!keydown) {
keydown = true;
console.log('key down');
}
window.addEventListener('keyup', function() {
keydown = false;
});
});
Solution 4:
Solutions above dont take in account multiple key presses (imagine a game where the user can presse up and left at the same time but both need to be triggered just once). I needed a universal solution for disabling key repeat on multiple keyPress for ALL keys:
// create an array with 222 (number of keycodes) values set to true
var keyEnabledArray = Array(222).fill(true);
document.onkeydown = function(e){
// disable the key until key release
if(keyEnabledArray[e.keyCode]) {
keyEnabledArray[e.keyCode] = false;
}
};
document.onkeyup = function(e){
// enable the specific key on keyup
keyEnabledArray[e.keyCode] = true;
};
Check the snippet below:
// create an array with 222 true values
var keyEnabledArray = Array(222).fill(true);
document.onkeydown = function(e){
// disable the key until key release
if(keyEnabledArray[e.keyCode]) {
keyEnabledArray[e.keyCode] = false;
document.getElementById('console').innerHTML += e.keyCode + '<br>';
}
};
document.onkeyup = function(e){
keyEnabledArray[e.keyCode] = true;
};
Press a key:
<div id='console'></div>
Solution 5:
Use keyup
event. It is fired when they key is lifted.