keydown (повтор) прерывается при срабатывании события keyup (для ДРУГОГО ключа) - PullRequest
1 голос
/ 30 апреля 2011

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

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

Клавиши со стрелками используются для перемещения игрока (так как функция 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: Keyboard Events , и я не вижу ничего об этом специфическом поведении.

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

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

Ответы [ 2 ]

5 голосов
/ 30 апреля 2011

Так работает ОС / среда и, как следствие, работает браузер.

Повторение нажатия клавиши не должно продолжаться после нажатия клавиши с другого ключа в браузере, так как он не ведет себя таким образом где-либо еще. Откройте Блокнот или vim, или pico, или любой другой текстовый редактор, который вы используете, и выполните ту же последовательность событий. Вы увидите, что после нажатия клавиши первая нажатая клавиша не продолжает печатать новые буквы. Именно так эти вещи были разработаны в ОС, и в результате они распространяются на редакторы, браузеры и т. Д.

0 голосов
/ 17 января 2019

Вот моя система ввода с клавиатуры.Вы можете увидеть, как повторяющийся ключ может быть извлечен для вашего собственного использования здесь.Это позволит вам заметить удерживаемые ключи и не полагаться на операционную систему в качестве неверно принятого другого ответа.


var down = [140]; //make an array to cover all the keypresses you should need with a normal keyboard

document.addEventListener('keydown', function(event) {
  if (down[event.keyCode]){
    return;
  } else {
   //do the normal things you do when you get key presses
  down[event.keyCode]=true;
  }
}, true);
document.addEventListener('keyup', function(event) {
  down[event.keyCode]=false;
   //do the normal things you do when you get key releases
}, true);

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

...