Dragula — это библиотека для реализации перетаскивания элементов между контейнерами с минимальной настройкой. Для работы необходимо подключить саму библиотеку и стили. Можно использовать CDN:
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/dragula/3.7.3/dragula.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/dragula/3.7.3/dragula.min.js"></script>
После подключения Dragula становится доступной через глобальный
объект dragula. Контейнеры, в которых будут происходить
операции drag & drop, передаются в функцию инициализации.
const containers = [document.getElementById('left'), document.getElementById('right')];
const drake = dragula(containers);
Dragula предоставляет обширную систему событий, позволяющую отслеживать все стадии перетаскивания элементов. Ключевые события:
drag: инициируется в момент начала перетаскивания.drop: срабатывает при отпускании элемента в
контейнере.over: когда перетаскиваемый элемент попадает в
контейнер.out: когда элемент покидает контейнер.cancel: когда операция отменяется.cloned: при клонировании элемента.shadow: когда создается тень перетаскиваемого
элемента.Для логирования используется метод on объекта
drake:
drake.on('drag', (el, source) => {
console.log('Начато перетаскивание элемента:', el);
console.log('Исходный контейнер:', source);
});
drake.on('drop', (el, target, source, sibling) => {
console.log('Элемент помещен в контейнер:', target);
console.log('Исходный контейнер:', source);
console.log('Элемент перед:', sibling);
});
Каждое событие Dragula передает специфические параметры. Их правильная интерпретация позволяет получать точные данные о процессе:
Пример логирования всех параметров drop:
drake.on('drop', (el, target, source, sibling) => {
console.group('Событие drop');
console.log('Элемент:', el);
console.log('Целевой контейнер:', target);
console.log('Исходный контейнер:', source);
console.log('Следующий сосед:', sibling);
console.groupEnd();
});
Использование console.group позволяет структурировать
лог, особенно при большом количестве операций.
Dragula поддерживает перемещение элементов между несколькими контейнерами. Для полноценного логирования рекомендуется фиксировать идентификаторы контейнеров и элементов:
drake.on('over', (el, container) => {
console.log(`Элемент ${el.id} вошел в контейнер ${container.id}`);
});
drake.on('out', (el, container) => {
console.log(`Элемент ${el.id} покинул контейнер ${container.id}`);
});
Такой подход помогает визуализировать динамику перемещения элементов при сложных интерфейсах.
Dragula позволяет отменять перенос или работать с клонированными
элементами. События cancel и cloned
информируют об этих случаях:
drake.on('cancel', (el, container, source) => {
console.log(`Перетаскивание элемента ${el.id} отменено`);
console.log('Контейнер отмены:', container);
console.log('Исходный контейнер:', source);
});
drake.on('cloned', (clone, original, type) => {
console.log(`Создан клон элемента ${original.id}`);
console.log('Клон:', clone);
console.log('Тип клонирования:', type);
});
Тип клонирования может быть 'mirror' — создается
зеркальная копия для визуальной демонстрации перемещения.
В больших приложениях полезно вести структурированный журнал действий. Пример с записью в массив:
const log = [];
drake.on('drag', (el, source) => log.push({event: 'drag', elId: el.id, sourceId: source.id}));
drake.on('drop', (el, target, source, sibling) => log.push({event: 'drop', elId: el.id, targetId: target.id, sourceId: source.id, siblingId: sibling?.id || null}));
drake.on('cancel', (el, container, source) => log.push({event: 'cancel', elId: el.id, containerId: container.id, sourceId: source.id}));
console.table(log);
Использование структуры с массивом объектов позволяет легко фильтровать, группировать и визуализировать события. Для интерфейсов с большим количеством элементов такой подход обеспечивает прозрачность всех действий пользователя.
Dragula-логи могут отправляться на сервер или в аналитические системы:
drake.on('drop', (el, target, source, sibling) => {
fetch('/api/logDragula', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
event: 'drop',
element: el.id,
target: target.id,
source: source.id,
sibling: sibling?.id || null,
timestamp: new Date().toISOString()
})
});
});
Такой подход позволяет отслеживать действия пользователей в реальном времени, анализировать их поведение и улучшать UX интерфейсов.
Логирование событий Dragula, правильно настроенное, превращает простую перетаскиваемую функциональность в инструмент с полной трассировкой действий пользователя и глубоким аналитическим потенциалом.