Вы можете просто проверить массив «вниз» и положение в нем любого кода клавиши, который вы хотите. Я использую его для предотвращения повторов клавиш для ввода игры. Надеюсь это поможет!
емного странно, поэтому я полагаю, что я либо упускаю что-то очевидное, либо это недостаток того, как эти события реализованы в браузерах.
Позвольте мне вначале кратко изложить пример сценария, с которым сталкивается эта проблема, прежде чем приводить отдельный пример случая;
Клавиши со стрелками используются для перемещения игрока (так как функция 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>
Вы также можете попробовать это здесь:
Нажмите любую клавишу на странице, и вы увидите, что код клавиши появится на странице. Когда вы удерживаете клавишу, код клавиши повторяется снова и снова.
Поведение становится странным, когда нажимаешь другую клавишу, пока нажата начальная клавиша. При отпускании этого недавнего ключа повторение прекращается с первого ключа. Интересно, что если вы попробуете пример и удерживаете одну клавишу, а затем удерживаете вторую клавишу, но вместо того, чтобы отпустить вторую, отпустите первую: вторая клавиша продолжает повторяться.
Таким образом, кажется, что при срабатывании события keyup прерывание повторяется в событиях keydown, которые были запущены для более раннего ключа.
Я пробовал все виды вещей, начиная от использования возврата false в обеих функциях обработки событий, возврата true, пробуя нажатие клавиши вместо нажатия клавиши, сохранения состояний клавиш и продолжения перемещения, если состояние клавиши кнопки все еще истинно, но к чему все это сводится Это означает, что при срабатывании keyup любые активно распространяющиеся события keydown уничтожаются. Я прочиталJavaScript Madness: события клавиатуры и я не вижу ничего об этом специфическом поведении.
Это недостаток дизайна в реализации ключевых событий, или я что-то упустил? Я наблюдаю такое же поведение в Chrome, IE и Firefox.
Любой совет или вклад?