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:

http://unixpapa.com/js/key.html


эта проблема существует уже давно, но я думаю, что только что обнаружил исправление. Кажется, это работает нормально

$("#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