Выбрать главу

<a href="https://developer.mozilla.org/">MDN</a>

<script>

  var link = document.querySelector("a");

  link.addEventListener("click", function(event) {

    console.log("Фигушки.");

    event.preventDefault();

  });

</script>

Не делайте так – если у вас нет очень серьёзной причины! Пользователям вашей страницы будет очень неудобно, когда они столкнутся с неожиданными результатами своих действий. В зависимости от браузера, некоторые события перехватить нельзя. В Chrome нельзя обрабатывать горячие клавиши закрытия текущей закладки (Ctrl-W или Command-W).

События от кнопок клавиатуры

При нажатии кнопки на клавиатуре браузер запускает событие "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.

Кнопки мыши

Нажатие кнопки мыши тоже запускает несколько событий. События "mousedown" и "mouseup" похожи на "keydown" и "keyup", и запускаются, когда кнопка нажата и когда отпущена. События происходят у тех узлов DOM, над которыми находился курсор мыши.

После события "mouseup" на узле, на который пришлись и нажатие, и отпускание кнопки, запускается событие "click". Например, если я нажал кнопку над одним параграфом, потом передвинул мышь на другой параграф и отпустил кнопку, событие "click" случится у элемента, который содержал в себе оба эти параграфа.