jQuery keypress событие срабатывает повторно, когда ключ удерживается - но не на всех клавишах
это, вероятно, намеренное поведение или, по крайней мере, не проблема 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,[,
etc), событие срабатывает, и вы получаете хорошее сообщение журнала в консоли. Все в порядке и по назначению. Однако теперь попробуйте удерживать клавишу - после короткой паузы вы увидите, что событие keydown срабатывает несколько раз, когда вы держите ключ, однако, если вы попытаетесь нажать p
(или, например, a j
), он будет стрелять только один раз.
Я тестирую это с помощью FF 9.0.1 и mac OSX 10.7.1 и jQuery 1.7.1.
это по дизайну, это функция, зависящая от браузера, или это связано с ОС или даже с самой клавиатурой? Также у кого-нибудь есть список ключей, которые будут повторите и ключи, которые не будут?
Что касается варианта использования, на самом деле его нет - это просто появилось, когда я привязывал анимацию к нажатию курсора и начал видеть поведение wierd при нажатии клавиши. Моим обходным путем было использование keyup()
вместо этого событие и preventDefault()
на keydown()
событие для ключей, в которых я был insterested, чтобы остановить курсоры прокрутки экрана.
обновление:
Кажется, что на событии нажатия клавиши keyCode всегда 0
для большинства письма, которые могут иметь какое-то отношение к тому, почему я думал, что обработчик выстрелил только один раз. После еще нескольких тестов я вижу повторяющиеся записи журнала, такие как для курсоров. Если вы проверите страницу API jQuery и используете демонстрацию на этом, она показывает поведение, которое я описывал:http://api.jquery.com/keypress/
до сих пор не могу объяснить себе :/
3 ответов
поведение зависит от браузеров и операционных систем. На следующей странице подробно рассматривается тема автоматически повторяющихся ключевых событий в разделе 2.2:
эта проблема существует уже давно, но я думаю, что только что обнаружил исправление. Кажется, это работает нормально
$("#search_query").keyup(function(event) {
//this will void fake keypresses
if(event.charCode == 0 && event.keyCode == 0) {
return false;
}
//place the rest of you code here
});
также-в интересах всех людей, которые просматривают этот пост: попробуйте метод "keydown"
нажатие клавиши будет уволен несколько раз... события keydown не
http://jquerymobile.com/demos/1.0a2/experiments/api-viewer/docs/keypress/index.html