Событие – это сигнал от браузера о том, что что-то произошло. Все DOM-узлы подают такие сигналы (хотя события бывают и не только в DOM).
Вот список самых часто используемых DOM-событий, пока просто для ознакомления:
События мыши:
click
– происходит, когда кликнули на элемент левой кнопкой мыши (на устройствах с сенсорными экранами оно происходит при касании).contextmenu
– происходит, когда кликнули на элемент правой кнопкой мыши.mouseover
/mouseout
– когда мышь наводится на / покидает элемент.mousedown
/mouseup
– когда нажали / отжали кнопку мыши на элементе.mousemove
– при движении мыши.
События на элементах управления:
submit
– пользователь отправил форму<form>
.focus
– пользователь фокусируется на элементе, например нажимает на<input>
.
Клавиатурные события:
keydown
иkeyup
– когда пользователь нажимает / отпускает клавишу.
События документа:
DOMContentLoaded
– когда HTML загружен и обработан, DOM документа полностью построен и доступен.
CSS events:
transitionend
– когда CSS-анимация завершена.
Существует множество других событий. Мы подробно разберём их в последующих главах.
Обработчики событий
Событию можно назначить обработчик, то есть функцию, которая сработает, как только событие произошло.
Именно благодаря обработчикам JavaScript-код может реагировать на действия пользователя.
Есть несколько способов назначить событию обработчик. Сейчас мы их рассмотрим, начиная с самого простого.
Использование атрибута HTML
Обработчик может быть назначен прямо в разметке, в атрибуте, который называется on<событие>
.
Например, чтобы назначить обработчик события click
на элементе input
, можно использовать атрибут onclick
, вот так:
<input value="Нажми меня" onclick="alert('Клик!')" type="button">
При клике мышкой на кнопке выполнится код, указанный в атрибуте onclick
.
Обратите внимание, для содержимого атрибута onclick
используются одинарные кавычки, так как сам атрибут находится в двойных. Если мы забудем об этом и поставим двойные кавычки внутри атрибута, вот так: onclick="alert("Click!")"
, код не будет работать.
Атрибут HTML-тега – не самое удобное место для написания большого количества кода, поэтому лучше создать отдельную JavaScript-функцию и вызвать её там.
Следующий пример по клику запускает функцию countRabbits()
:
<script>
function countRabbits() {
for(let i=1; i<=3; i++) {
alert("Кролик номер " + i);
}
}
</script>
<input type="button" onclick="countRabbits()" value="Считать кроликов!">
Как мы помним, атрибут HTML-тега не чувствителен к регистру, поэтому ONCLICK
будет работать так же, как onClick
и onCLICK
… Но, как правило, атрибуты пишут в нижнем регистре: onclick
.
Использование свойства DOM-объекта
Можно назначать обработчик, используя свойство DOM-элемента on<событие>
.
К примеру, elem.onclick
:
<input id="elem" type="button" value="Нажми меня!">
<script>
elem.onclick = function() {
alert('Спасибо');
};
</script>
Если обработчик задан через атрибут, то браузер читает HTML-разметку, создаёт новую функцию из содержимого атрибута и записывает в свойство.
Этот способ, по сути, аналогичен предыдущему.
Обработчик всегда хранится в свойстве DOM-объекта, а атрибут – лишь один из способов его инициализации.
Эти два примера кода работают одинаково:
- Только HTML:
<input type="button" onclick="alert('Клик!')" value="Кнопка">
- HTML + JS:
<input type="button" id="button" value="Кнопка"> <script> button.onclick = function() { alert('Клик!'); }; </script>
Так как у элемента DOM может быть только одно свойство с именем onclick
, то назначить более одного обработчика так нельзя.
В примере ниже назначение через JavaScript перезапишет обработчик из атрибута:
<input type="button" id="elem" onclick="alert('Было')" value="Нажми меня">
<script>
elem.onclick = function() { // перезапишет существующий обработчик
alert('Станет'); // выведется только это
};
</script>
Кстати, обработчиком можно назначить и уже существующую функцию:
function sayThanks() {
alert('Спасибо!');
}
elem.onclick = sayThanks;
Убрать обработчик можно назначением elem.onclick = null
.
Доступ к элементу через this
Внутри обработчика события this
ссылается на текущий элемент, то есть на тот, на котором, как говорят, «висит» (т.е. назначен) обработчик.
В коде ниже button
выводит своё содержимое, используя this.innerHTML
:
<button onclick="alert(this.innerHTML)">Нажми меня</button>