Книга: Выразительный JavaScript
События от кнопок клавиатуры
События от кнопок клавиатуры
При нажатии кнопки на клавиатуре браузер запускает событие "keydown"
. Когда она отпускается, происходит событие "keyup"
.
<p>Страница по нажатию V офиолетивает.</p>
<script>
addEventListener("keydown", function(event) {
if (event.keyCode == 86)
document.body.style.background = "violet";
});
addEventListener("keyup", function(event) {
if (event.keyCode == 86)
document.body.style.background = "";
});
</script>
Несмотря на название, "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
событий клавиатуры и мыши.
<p>Нажмите Ctrl-Space для продолжения.</p>
<script>
addEventListener("keydown", function(event) {
if (event.keyCode == 32 && event.ctrlKey)
console.log("Продолжаем!");
});
</script>
События "keydown"
и "keyup"
дают информацию о физическом нажатии кнопок. А если вам нужно узнать, какой текст вводит пользователь? Создавать его из нажатий кнопок – неудобно. Для этого существует событие "keypress"
, происходящее сразу после "keydown"
(и повторяющееся вместе с "keydown"
, если клавишу продолжают удерживать), но только для тех кнопок, которые выдают символы. Свойство объекта события charCode
содержит код, который можно интерпретировать как код Unicode. Мы можем использовать функцию String.fromCharCode
для превращения кода в строку из одного символа.
<p>Переведите фокус на страницу и печатайте.</p>
<script>
addEventListener("keypress", function(event) {
console.log(String.fromCharCode(event.charCode));
});
</script>
Источником события нажатия клавиши узел становится в зависимости от того, где находился фокус ввода во время нажатия. Обычные узлы не могут получить фокус ввода (если только вы не задали им атрибут tabindex
), а такие, как ссылки, кнопки и поля форм – могут. Мы вернёмся к полям ввода в главе 18. Когда ни у чего нет фокуса, в качестве целевого узла событий работает document.body
.
- Обработчики событий
- События и узлы DOM
- Объекты событий
- Распространение (propagation)
- Действия по умолчанию
- События от кнопок клавиатуры
- Кнопки мыши
- Движение мыши
- События прокрутки
- События, связанные с фокусом
- Событие загрузки
- График выполнения скрипта
- Установка таймеров
- Устранение помех (debouncing)
- Итог
- Упражнения
- События и узлы DOM
- Простейшие события
- Профилактика поломок клавиатуры
- Создание рабочей области для собраний на основе календарного события
- Устройство клавиатуры компьютера
- События
- Как работают сценарии. События
- Создание клавиатуры
- 13.2.7. Ожидание события
- Генерирование события оплаты
- Когда не нужно создавать процедур обработки события Click
- Кнопки и группы кнопок