JavaScript обеспечивает мощную событийную модель, которая позволяет взаимодействовать с элементами DOM. Основные понятия, которые необходимо понимать: EventListener и всплытие событий (Event Bubbling).
1. EventListener
Что такое EventListener?
**EventListener** — это механизм, который позволяет привязывать обработчики событий к элементам DOM. Эти обработчики выполняются при наступлении определённого события, например, клика мыши или нажатия клавиши.Основные методы
- **`addEventListener`**: Добавляет обработчик события. - **`removeEventListener`**: Удаляет ранее добавленный обработчик.Пример использования
```javascript const button = document.getElementById('myButton');// Добавление обработчика события button.addEventListener('click', () => { console.log('Button clicked!'); });
// Удаление обработчика события const handler = () => { console.log('Handler removed'); }; button.addEventListener('click', handler); button.removeEventListener('click', handler);
text
<h3 id="параметры-addeventlistener">Параметры `addEventListener`</h3>
1. **Тип события**: Например, `'click'`, `'keydown'`, `'submit'`.
2. **Функция-обработчик**: Код, который будет выполнен при наступлении события.
3. **Опции**:
- `capture`: Указывает, должен ли обработчик работать на стадии захвата.
- `once`: Выполнить обработчик только один раз.
- `passive`: Указывает, что обработчик не будет вызывать `preventDefault`.
Пример с опциями:
```javascript
button.addEventListener('click', () => {
console.log('Clicked once!');
}, { once: true });
2. Всплытие событий (Event Bubbling)
Что такое всплытие?
События в JavaScript распространяются от целевого элемента к его родителям, доходя до корневого элемента (обычно `document`). Это называется **всплытием**.Пример всплытия
HTML: ```htmlJavaScript:
javascript
const parent = document.getElementById('parent');
const child = document.getElementById('child');
parent.addEventListener('click', () => {
console.log('Parent clicked!');
});
child.addEventListener('click', () => {
console.log('Child clicked!');
});
Результат: При клике на кнопку будет выведено:
Child clicked!
Parent clicked!
(событие "всплыло" от дочернего элемента к родительскому).
Как остановить всплытие?
С помощью метода `stopPropagation` можно предотвратить дальнейшее распространение события.Пример:
javascript
child.addEventListener('click', (event) => {
console.log('Child clicked!');
event.stopPropagation(); // Событие не "всплывает" к родителю
});
Фазы событий
Событие проходит через три фазы: 1. **Захват (Capture phase)**: Событие идёт сверху вниз, от `document` к целевому элементу. 2. **Целевая фаза (Target phase)**: Событие достигает целевого элемента. 3. **Всплытие (Bubbling phase)**: Событие "всплывает" от целевого элемента к корневому.Пример с фазами:
javascript
parent.addEventListener('click', () => {
console.log('Parent - capturing phase');
}, true); // Захват
child.addEventListener('click', () => {
console.log('Child - target phase');
}); // Цель
parent.addEventListener('click', () => {
console.log('Parent - bubbling phase');
}); // Всплытие
Результат при клике на child
:
Parent - capturing phase
Child - target phase
Parent - bubbling phase
Итоговые вопросы для подготовки
- Что такое EventListener, и как его использовать?
- Чем отличается всплытие событий от захвата?
- Как остановить всплытие события?
- Для чего используются опции
capture
,once
, иpassive
?
Совет: Попробуйте реализовать примеры с разными фазами и опциями, чтобы лучше понять событийную модель.