Dragula — это библиотека для реализации drag-and-drop функционала в веб-приложениях на JavaScript. Для её использования достаточно подключить скрипт и стили, доступные через CDN или через менеджеры пакетов, такие как npm.
Пример подключения через npm:
npm install dragula
В Jav * aScript:
import dragula from 'dragula';
import 'dragula/dist/dragula.css';
Для использования через CDN достаточно добавить ссылки в HTML:
<link rel="stylesheet" href="https://unpkg.com/dragula/dist/dragula.min.css">
<script src="https://unpkg.com/dragula/dist/dragula.min.js"></script>
Dragula работает на основе контейнеров — элементов DOM, внутри которых возможна перетаскиваемость.
const containers = [document.getElementById('left'), document.getElementById('right')];
const drake = dragula(containers);
При этом каждый контейнер автоматически становится зоной перетаскивания. Элементы можно перемещать между контейнерами и внутри одного контейнера.
Dragula предоставляет набор событий для отслеживания действий пользователя:
drag — элемент начал
перемещаться.drop — элемент был перемещён и
отпущен.over — курсор с перетаскиваемым
элементом находится над контейнером.out — элемент покидает контейнер.cancel — перемещение было
отменено.Обработка этих событий позволяет реализовать гибкое управление логикой перемещения:
drake.on('drop', (el, target, source, sibling) => {
console.log(`Элемент ${el.textContent} перемещён из ${source.id} в ${target.id}`);
});
Dragula позволяет контролировать, какие элементы можно
перетаскивать, и куда их можно помещать с помощью функций
moves, accepts и invalid.
moves — определяет, может ли элемент
быть перетянут.dragula(containers, {
moves: (el, source, handle, sibling) => handle.classList.contains('handle')
});
accepts — определяет, может ли
контейнер принимать элемент.dragula(containers, {
accepts: (el, target, source, sibling) => target.id !== 'left'
});
invalid — предотвращает перетаскивание
определённых элементов.dragula(containers, {
invalid: el => el.classList.contains('locked')
});
При работе с drag-and-drop важна защита от некорректных действий, таких как попытка переместить элемент в запрещённую зону или дважды добавить один и тот же элемент. Dragula предоставляет встроенные механизмы для таких ситуаций, а также возможность создавать собственные обработчики ошибок.
Функция accepts позволяет предотвратить попадание
элемента в недопустимый контейнер. Если пользователь пытается поместить
элемент в запрещённую область, Dragula автоматически возвращает
элемент в исходное положение.
Пример:
dragula(containers, {
accepts: (el, target) => target.id !== 'forbidden'
}).on('drop', (el, target) => {
if (target.id === 'forbidden') {
console.warn(`Элемент ${el.textContent} не может быть помещён в запрещённый контейнер.`);
}
});
Иногда требуется позволить пользователю отменить перемещение до
завершения. Событие cancel помогает реализовать это:
drake.on('cancel', (el, container, source) => {
console.info(`Перемещение элемента ${el.textContent} отменено пользователем`);
});
Если элементы могут быть случайно продублированы при перемещении, необходимо контролировать уникальность. Это можно реализовать через проверку данных элемента перед вставкой:
drake.on('drop', (el, target) => {
const exists = Array.from(target.children).some(child => child.dataset.id === el.dataset.id && child !== el);
if (exists) {
drake.cancel(true);
console.error(`Элемент с id ${el.dataset.id} уже существует в контейнере.`);
}
});
В некоторых случаях элемент содержит данные, которые нужно проверить перед перемещением. Например, при перетаскивании формы с заполненными полями:
drake.on('drop', (el) => {
const input = el.querySelector('input');
if (input && input.value.trim() === '') {
drake.cancel(true);
alert('Невозможно переместить пустое поле');
}
});
Dragula позволяет интегрировать систему логирования ошибок и уведомления пользователя:
console.warn,
console.error) для разработчика.alert или кастомные уведомления)..error к элементу.drake.on('drop', (el, target) => {
if (target.id === 'invalid') {
el.classList.add('error');
drake.cancel(true);
}
});
Dragula не выбрасывает стандартные ошибки JavaScript при неправильных
действиях пользователя, но можно использовать блоки
try...catch для защиты собственных функций, вызываемых в
обработчиках событий:
drake.on('drop', (el, target) => {
try {
processElement(el, target);
} catch (error) {
console.error('Ошибка обработки элемента:', error);
drake.cancel(true);
}
});
Таким образом, комплексная обработка ошибок в Dragula включает: контроль разрешённых контейнеров, предотвращение дублирования, валидацию данных, отмену перетаскивания и логирование. Правильное сочетание этих подходов делает интерфейс безопасным и предсказуемым при любых действиях пользователя.