How can I avoid autorepeated keydown events in JavaScript?

后端 未结 4 1616
离开以前
离开以前 2020-12-01 07:59

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

4条回答
  •  不思量自难忘°
    2020-12-01 08:12

    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 );
        }
    

提交回复
热议问题