Это, вероятно, предполагаемое поведение или, по крайней мере, не проблема jQuery / js, но я хотел бы получить некоторые пояснения, если есть какие-либо
Возьмите следующее:
$(document).bind('keypress', function(e){
switch(e.keyCode)
{
case 37:
console.log('left cursor keydown, will fire on hold');
break;
case 39:
console.log('right cursor keydown, will fire on hold');
break;
case 80:
console.log('p will only fire once per press!');
break;
}
});
Вы также можете поиграть с примером в документации jQuery: http://api.jquery.com/keypress/
При нажатии курсора влево или вправо (или многие другие клавиши, такие как A, E, [,
и т. д.), событие запускается, и вы получаете красивое сообщение журнала в консоли. Все в порядке, как и предполагалось. Однако теперь попробуйте удерживать клавишу - после короткой паузы вы увидите, что событие нажатия клавиши запускается несколько раз, когда вы удерживаете клавишу, однако, если вы попытаетесь нажать p
(или, например, j
), он сработает только один раз.
Я тестирую это, используя FF 9.0.1 и mac OSX 10.7.1 и jQuery 1.7.1.
Это дизайн, это функция, зависящая от браузера, или это что делать с ОС или даже с самой клавиатурой? Также у кого-нибудь есть список клавиш, которые Будет ли повторяться, и ключи, которые не будут?
Что касается варианта использования, на самом деле его нет - это просто возникло, когда я привязывал анимацию к нажатию курсора и начал замечать странное поведение при нажатии клавиши .Мое обходное решение заключалось в использовании вместо этого события keyup ()
и preventDefault ()
в событии keydown ()
для ключей, которые меня интересовали, чтобы остановить курсоры прокручивают экран.
ОБНОВЛЕНИЕ:
Похоже, что в событии нажатия клавиши keyCode всегда равен 0
для большинства букв, что может иметь какое-то отношение к тому, почему я думал, что обработчик запускается только один раз. После еще нескольких тестов я вижу повторяющиеся записи в журнале, как для курсоров. Если вы посмотрите страницу API jQuery и воспользуетесь ею в демонстрации, она покажет поведение, которое я описывал: http://api.jquery.com/keypress/
Я все еще не могу это объяснить: /