If the user holds down the key, multiple keydown events are fired. For usability reasons I need to use keydown, not keyup, but I want to avoid this situation. My relevant co
So, if the existing solution seems dubious (it doesn't consider the case when 2 or more buttons is pressed simultaneously), I suggest another solution that takes it into account.
The _prevKeyDown object is to store keys that are currently pressed.
_prevKeyDown = {}
function _downKey( event )
{
var wh = event.which;
var kC = event.keyCode;
if( _prevKeyDown[ wh ] == null )
{
_prevKeyDown[ wh ] = {};
}
_prevKeyDown[ wh ][ kC ] = true;
};
function _upKey( event )
{
var wh = event.which;
var kC = event.keyCode;
if( _prevKeyDown[ wh ] != null )
{
_prevKeyDown[ wh ][ kC ] = null;
}
};
function _isKeyDown( event )
{
var wh = event.which;
var kC = event.keyCode;
var result = false;
if( this._prevKeyDown[ wh ] != null )
{
if( this._prevKeyDown[ wh ][ kC ] == true )
{
result = true;
}
}
return result;
}
// now your keydown/keyup handlers
function keydown( event )
{
if( !_isKeyDown( event ) )
{
// your once-keydown handler here
_downKey( event );
}
}
function keyup( event )
{
_upKey( event );
}