Выразительный JavaScript (Хавербеке) - страница 145

>

Несмотря на название, >"keydown" происходит не только тогда, когда на кнопку нажимают. Если нажать и удерживать кнопку, событие будет происходить каждый раз по приходу повторного сигнала от клавиши (key repeat). Если вам, к примеру, надо увеличивать скорость игрового персонажа, когда нажата кнопка со стрелкой, и уменьшать её, когда она отпущена – надо быть осторожным, чтобы не увеличить скорость каждый раз при повторе сигнала от кнопки, иначе скорость возрастёт очень сильно.

В примере упомянуто свойство >keyCode объекта события. Так вы можете узнать, какая именно кнопка нажата или отпущена. К сожалению, не всегда очевидно, как преобразовать числовые коды в нужную кнопку.

Для цифр и букв код будет кодом символа Unicode, связанного с прописным символом, изображённым на кнопке. Метод строки >charCodeAt даёт нам этот код.

>console.log("Violet".charCodeAt(0));

>// → 86

>console.log("1".charCodeAt(0));

>// → 49

У других кнопок коды менее предсказуемы. Лучший способ их выяснить – экспериментальный. Зарегистрировать обработчик, который записывает коды клавиш, и нажать нужную кнопку.

Кнопки-модификаторы типа Shift, Ctrl, Alt, и Meta (Command на Mac) создают события, как и нормальные кнопки. Но при разборе комбинаций клавиш можно выяснить, были ли нажаты модификаторы, через свойства >shiftKey, >ctrlKey, >altKey, и >metaKey событий клавиатуры и мыши.

>

Нажмите Ctrl-Space для продолжения.

>

События >"keydown" и >"keyup" дают информацию о физическом нажатии кнопок. А если вам нужно узнать, какой текст вводит пользователь? Создавать его из нажатий кнопок – неудобно. Для этого существует событие >"keypress", происходящее сразу после >"keydown" (и повторяющееся вместе с >"keydown", если клавишу продолжают удерживать), но только для тех кнопок, которые выдают символы. Свойство объекта события >charCode содержит код, который можно интерпретировать как код Unicode. Мы можем использовать функцию >String.fromCharCode для превращения кода в строку из одного символа.

>

Переведите фокус на страницу и печатайте.

>