Существует три типа событий клавиатуры: keydown, keypress и keyup, которые соот_ ветствуют обработчикам событий onkeydown, onkeypress и onkeyup. Как правило, од_ но нажатие клавиши генерирует три события, когда клавиша отпускается: key_ down, keypress и keyup. Если клавиша удерживается в нажатом состоянии и при этом включен режим автоповтора, между событиями keydown и keyup может про_ изойти несколько событий keypress, но такое поведение зависит от настройки сис_ темных параметров и параметров броузера, поэтому полагаться на него нельзя.
Из трех клавиатурных событий событие keypress наиболее дружественное по от_ ношению к пользователю: объект события, ассоциированный с ним, содержит код фактического символа нажатой клавиши. События keydown и keyup являются низкоуровневыми, объекты этих событий содержат так называемый «виртуаль_ ный код клавиши», который соответствует аппаратному коду, генерируемому клавиатурой. Для алфавитно_цифровых символов из набора ASCII эти виртуаль_
17.5. События клавиатуры
ные коды совпадают с ASCII_кодами, но они обработаны лишь частично. Если нажать и удерживать клавишу Shift и при этом нажать клавишу 2, событие key_ down сообщит, что была нажата комбинация клавиш Shift_2. Событие keypress вы_ полнит полную интерпретацию и сообщит, что нажатая комбинация клавиш со_ ответствует печатному символу @. (В разных раскладках клавиатуры могут быть получены разные результаты.)
Функциональные клавиши, которые не соответствуют печатным символам, та_ кие как Backspace, Enter, Escape, клавиши со стрелками, Page Up, Page Down и клави_ ши от F1 до F12, генерируют события keydown и keyup. В некоторых броузерах они также генерируют событие keypress. Однако в IE событие keypress генерируется только тогда, когда результатом нажатия является ASCII_код, т. е. печатный или управляющий символ. Функциональные клавиши, не соответствующие ни одно_ му из печатных символов, имеют виртуальные коды, которые доступны через объект события keydown. Например, клавиша «стрелка влево» генерирует код 37 (по крайней мере, в стандартной североамериканской раскладке клавиатуры).
Таким образом, как правило, событие keydown наилучшим образом подходит для обработки нажатий функциональных клавиш, а событие keypress – для обработ_ ки нажатий клавиш с печатными символами.