Это немного странно, поэтому я полагаю, что я либо упускаю что-то очевидное, либо это недостаток в том, как эти события реализованы в браузерах.
Позвольте мне вначале подвести итог примера сценария этой проблемы.перед тем, как предоставить отдельный пример случая;
Клавиши со стрелками используются для перемещения игрока (так как функция 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.
Любой совет или ввод?