Вы можете просто проверить массив «вниз» и положение в нем любого кода клавиши, который вы хотите. Я использую его для предотвращения повторов клавиш для ввода игры. Надеюсь это поможет!

емного странно, поэтому я полагаю, что я либо упускаю что-то очевидное, либо это недостаток того, как эти события реализованы в браузерах.

Позвольте мне вначале кратко изложить пример сценария, с которым сталкивается эта проблема, прежде чем приводить отдельный пример случая;

Клавиши со стрелками используются для перемещения игрока (так как функция handleKeyDown запускается каждый раз, когда нажимается клавиша в любом месте на странице). Аналогично, каждый раз, когда клавиша отпускается, запускается другая функция (handleKeyUp).

Поскольку вы (игрок) удерживаете левую клавишу нажатой, функция handleKeyDown многократно срабатывает (что, я думаю, я думаю, бросает вызов тому, что вы ожидаете и что подразумевает название, но, тем не менее, это нормальное поведение во всех браузерах, как я уверен ты знаешь).

Итак, вот что происходит: игрок держит направление, чтобы идти в этом направлении; затем они нажимают цифровую клавишу (для элемента с горячей клавишей), КАК они продолжают идти, удерживая направление вниз. Здесь происходит следующее: когда вы отпускаете цифровую клавишу для элемента с горячей клавишей, повторение движения игрока просто прекращается!

Я написал очень маленький изолированный пример такого поведения:

<html>
<head>
    <script type='text/javascript' src='jquery-1.5.1.min.js'></script>
    <script type='text/javascript'>
        var log = {};
        var keyState = {};
        var keyCount = {'down': 0, 'up': 0};
        window.addEventListener('keydown', handleKeyDown, false);
        window.addEventListener('keyup', handleKeyUp, false);
        function handleKeyDown (e)
            {
            keyState[e.keyCode] = true;
            keyCount.down++;
            log.prepend(" ["+e.keyCode+"] ");
            return false;
            }
        function handleKeyUp (e)
            {
            keyState[e.keyCode] = false;
            keyCount.down++;
            return true;
            }
        $(function(){log = $('#log');});
    </script>
</head>
<body>
    <div id='debug'></div>
    <div id='log'></div>
</body>

Вы также можете попробовать это здесь:

http://sikosoft.net/keys.html

Нажмите любую клавишу на странице, и вы увидите, что код клавиши появится на странице. Когда вы удерживаете клавишу, код клавиши повторяется снова и снова.

Поведение становится странным, когда нажимаешь другую клавишу, пока нажата начальная клавиша. При отпускании этого недавнего ключа повторение прекращается с первого ключа. Интересно, что если вы попробуете пример и удерживаете одну клавишу, а затем удерживаете вторую клавишу, но вместо того, чтобы отпустить вторую, отпустите первую: вторая клавиша продолжает повторяться.

Таким образом, кажется, что при срабатывании события keyup прерывание повторяется в событиях keydown, которые были запущены для более раннего ключа.

Я пробовал все виды вещей, начиная от использования возврата false в обеих функциях обработки событий, возврата true, пробуя нажатие клавиши вместо нажатия клавиши, сохранения состояний клавиш и продолжения перемещения, если состояние клавиши кнопки все еще истинно, но к чему все это сводится Это означает, что при срабатывании keyup любые активно распространяющиеся события keydown уничтожаются. Я прочиталJavaScript Madness: события клавиатуры и я не вижу ничего об этом специфическом поведении.

Это недостаток дизайна в реализации ключевых событий, или я что-то упустил? Я наблюдаю такое же поведение в Chrome, IE и Firefox.

Любой совет или вклад?

Ответы на вопрос(0)

Ваш ответ на вопрос