В библиотеке Interact.js работа с событиями является ключевым элементом для реализации интерактивности. Одной из важных задач при построении сложных интерфейсов является контроль всплытия событий и предотвращение их нежелательного влияния на другие элементы страницы.
Interact.js генерирует собственные события при взаимодействии с
элементами, такие как dragmove, resizemove,
gesturemove и другие. Эти события по своей природе могут
всплывать, то есть передаваться от целевого элемента к
родительским элементам в DOM.
Пример базовой привязки события:
interact('.draggable')
.draggable({
listeners: {
move(event) {
console.log('Двигаем элемент', event.target);
}
}
});
В этом примере событие move срабатывает на элементе с
классом .draggable. Если родительский элемент тоже имеет
слушатель на аналогичное событие, без контроля всплытия он будет вызван
автоматически.
Чтобы остановить распространение события на родительские элементы,
используется метод
event.stopPropagation(), встроенный в
объекты событий Interact.js. Этот метод предотвращает дальнейшее
прохождение события вверх по DOM.
interact('.draggable')
.draggable({
listeners: {
move(event) {
event.stopPropagation();
console.log('Событие остановлено, родитель не реагирует');
}
}
});
В этом коде событие move будет обрабатываться только на
текущем элементе .draggable. Родительские обработчики не
будут вызваны.
Некоторые события могут инициировать стандартное поведение браузера
(например, выделение текста при перетаскивании). Для подавления этого
используется метод
event.preventDefault():
interact('.draggable')
.draggable({
listeners: {
move(event) {
event.preventDefault();
event.stopPropagation();
}
}
});
Комбинация preventDefault() и
stopPropagation() позволяет полностью контролировать
поведение элементов, не влияя на остальные обработчики и стандартные
действия браузера.
Interact.js поддерживает делегирование событий, что позволяет назначать обработчики на родительские элементы, а событие автоматически обрабатывает вложенные элементы, удовлетворяющие селектору.
interact('.container')
.on('dragmove', '.draggable', event => {
event.stopPropagation();
console.log('Обработчик делегирован, всплытие остановлено');
});
В этом случае обработчик установлен на .container, но
реагирует только на элементы .draggable.
stopPropagation() предотвращает дальнейшее распространение
события на родительские контейнеры выше .container.
Для сложных интерфейсов с несколькими уровнями вложенных
интерактивных элементов часто возникает необходимость
избирательно останавливать всплытие. Interact.js
предоставляет объект события, содержащий target и
currentTarget, что позволяет точно определить, где
применять stopPropagation().
interact('.nested-draggable')
.draggable({
listeners: {
move(event) {
if (event.target.classList.contains('stop-here')) {
event.stopPropagation();
}
}
}
});
Здесь событие будет остановлено только на элементах с классом
.stop-here, остальные элементы продолжат реагировать на
событие.
currentTarget отличается от target, что
позволяет различать элемент, на котором сработал обработчик, и элемент,
на котором произошло фактическое событие.Контроль всплытия событий в Interact.js — это инструмент для
гибкой и точной настройки интерактивности элементов.
Правильное использование stopPropagation() и
preventDefault() позволяет строить сложные интерфейсы с
множеством интерактивных слоев, не вызывая конфликтов между
обработчиками и стандартным поведением браузера.