В библиотеке Interact.js обработка событий разделяется на несколько фаз, что позволяет гибко управлять взаимодействием пользователя с элементами на странице. Понимание этих фаз критически важно для правильной настройки drag-and-drop, resize и gesture-взаимодействий.
Фаза capture выполняется первой при любом событии. В этой фазе событие движется от корневого элемента документа к целевому элементу (top-down). Она используется для:
Пример настройки обработчика capture:
interact('.draggable')
.on('dragstart', function (event) {
console.log('Capture phase: dragstart', event);
}, true); // третий параметр true указывает на фазу capture
Ключевой момент: фаза capture позволяет перехватывать события до того, как они будут обработаны на самом элементе.
После capture событие достигает цели, то есть непосредственно элемента, на котором произошло взаимодействие. В этой фазе выполняются основные действия, которые чаще всего ассоциируются с событием:
Пример:
interact('.resizable')
.resizable({
edges: { left: true, right: true, bottom: true, top: true }
})
.on('resizemove', function (event) {
let { x, y } = event.target.dataset;
x = (parseFloat(x) || 0) + event.deltaRect.left;
y = (parseFloat(y) || 0) + event.deltaRect.top;
Object.assign(event.target.style, {
width: `${event.rect.width}px`,
height: `${event.rect.height}px`,
transform: `translate(${x}px, ${y}px)`
});
event.target.dataset.x = x;
event.target.dataset.y = y;
});
Важно: Фаза target является основной для работы с координатами и визуальной трансформацией элементов.
После обработки на цели событие движется обратно к корню документа — это фаза всплытия. Она полезна для:
Пример:
interact(document)
.on('dragend', function (event) {
console.log('Bubble phase: dragend', event);
});
Особенность: обработчики во фазе всплытия могут реагировать на событие, уже изменённое на целевом элементе.
Interact.js вводит специальную фазу before-action, которая срабатывает перед началом любой интерактивной операции (drag, resize, gesture). Используется для:
event.interactable.stop().Пример проверки границ:
interact('.draggable')
.draggable({
listeners: {
beforestart(event) {
if (!event.target.classList.contains('allowed')) {
event.interactable.stop();
}
}
}
});
Эта фаза — собственно выполнение drag, resize или gesture. В ней обновляются координаты, размеры и выполняются все эффекты:
dragmove — перемещение элемента по координатам.resizemove — изменение размеров с учётом
ограничений.gesturemove — масштабирование и вращение с
мультитачем.Особенности:
event.dx, event.dy,
event.deltaRect) позволяют точно отслеживать изменения за
каждый кадр.Фаза after-action срабатывает по завершении интерактивного действия:
dragend — завершение перемещения.resizeend — завершение изменения размеров.gestureend — завершение жеста.Пример сохранения состояния:
interact('.draggable')
.draggable({
listeners: {
end(event) {
console.log(`Элемент ${event.target.id} перемещён на:`, event.pageX, event.pageY);
}
}
});
Значение этой фазы — окончательная фиксация данных и очистка временных переменных, использованных во время действия.
Каждое событие в Interact.js проходит через сочетание фаз, что позволяет гибко контролировать процесс:
before-action — проверка и возможность отмены.capture — перехват события на пути к цели.target — выполнение основных действий на элементе.action — обновление координат и визуальные
изменения.bubble — всплытие для глобальной обработки.after-action — завершение, сохранение состояния.Правильное использование этих фаз даёт полный контроль над интерактивными элементами и предотвращает нежелательные эффекты при сложных вложенных взаимодействиях.
Фазы событий в Interact.js позволяют разделять логику перехвата, основной обработки и финальной фиксации, обеспечивая прозрачность и предсказуемость поведения drag, resize и gesture. Это фундамент для построения сложных интерактивных интерфейсов с точной обработкой пользовательских действий.