Interact.js — это мощная библиотека для работы с интерактивными элементами на веб-странице: перетаскиванием, изменением размеров, жестами и сенсорными событиями. Одним из ключевых инструментов оптимизации работы с большим количеством элементов является делегирование событий.
Делегирование позволяет назначать обработчики не каждому элементу отдельно, а родительскому контейнеру, что значительно уменьшает количество слушателей и повышает производительность.
В Interact.js делегирование реализуется через параметр
delegate в методах interact:
interact(container)
.draggable({
delegate: '.item',
listeners: {
move(event) {
const target = event.target;
target.style.transform = `translate(${event.dx}px, ${event.dy}px)`;
}
}
});
Разбор кода:
interact(container) — создаёт интерактивное
пространство для родительского контейнера.delegate: '.item' — указывает, что событие будет
обработано для всех дочерних элементов с классом
.item.event.target — это именно тот элемент, на который
произошло событие, а не родительский контейнер.event.dx и event.dy — смещение элемента в
текущем событии движения.Такой подход позволяет добавлять новые элементы в DOM динамически без необходимости повторно назначать обработчики.
delegate и его особенностиПараметр delegate принимает CSS-селектор дочерних
элементов. Важные моменты:
ignoreFrom,
чтобы исключить обработку некоторых элементов:interact(container)
.draggable({
delegate: '.item',
ignoreFrom: '.no-drag',
listeners: { move: onMove }
});
resizable и gesturableInteract.js позволяет делегировать не только перетаскивание, но и изменение размеров, а также жесты (pinch, rotate):
interact(container)
.resizable({
delegate: '.resize-handle',
edges: { left: true, right: true, bottom: true, top: true },
listeners: {
move(event) {
const target = event.target;
let x = parseFloat(target.getAttribute('data-x')) || 0;
let y = parseFloat(target.getAttribute('data-y')) || 0;
target.style.width = `${event.rect.width}px`;
target.style.height = `${event.rect.height}px`;
x += event.deltaRect.left;
y += event.deltaRect.top;
target.style.transform = `translate(${x}px, ${y}px)`;
target.setAttribute('data-x', x);
target.setAttribute('data-y', y);
}
}
});
Особенности делегирования для resizable:
delegate указывает на ручки изменения размера, а не на
сам элемент.event.rect с новыми
размерами.deltaRect показывает изменение позиции и размеров
относительно предыдущего состояния.Для сложных интерфейсов часто требуется обработка только определённых
элементов или исключение других. Interact.js поддерживает комбинацию
delegate и ignoreFrom:
interact('#container')
.draggable({
delegate: '.draggable',
ignoreFrom: 'input, button',
listeners: {
move(event) {
const target = event.target;
target.style.transform = `translate(${event.dx}px, ${event.dy}px)`;
}
}
});
Пояснения:
.draggable будут
перетаскиваться.<input> и <button>
внутри контейнера не будут инициировать перетаскивание.delegate на элементы вне контейнера —
обработчик работать не будет.ignoreFrom — может блокировать
стандартное поведение элементов формы.delegate, если предполагается большое
количество интерактивных элементов.ignoreFrom для элементов формы и элементов
управления.delegate с атрибутами
data-*, чтобы хранить состояние и идентификаторы
элементов.Делегирование событий в Interact.js является основой для построения высокопроизводительных интерактивных интерфейсов с множеством элементов, обеспечивая гибкость и чистоту кода при управлении поведением DOM.