Shopify Draggable — это мощная библиотека для реализации интерактивного перетаскивания элементов в веб-приложениях. Одним из ключевых аспектов её использования является обеспечение корректной работы с различными элементами DOM и предотвращение ошибок, связанных с несовместимыми структурами. Валидация совместимости позволяет гарантировать, что операции перетаскивания выполняются только над подходящими элементами.
Draggable использует селекторы для определения, какие элементы можно
перетаскивать. Основным механизмом является свойство
draggable при инициализации объекта:
const draggable = new Draggable(document.querySelectorAll('.draggable-container'), {
draggable: '.draggable-item'
});
Важно: если в контейнере присутствуют элементы, не соответствующие селектору, они автоматически исключаются из взаимодействия. Это обеспечивает базовую валидацию на уровне DOM.
Для операций drag-and-drop можно задать ограничение на контейнеры,
между которыми разрешено перемещение элементов. В Draggable это
реализуется через containers:
const draggable = new Draggable([document.querySelector('#listA'), document.querySelector('#listB')], {
draggable: '.item'
});
Любая попытка переместить элемент вне указанных контейнеров будет игнорироваться. Это ключевой момент совместимости: не все контейнеры могут принимать любой тип элемента.
Для более сложных сценариев, когда необходимо разрешать перемещение
только между определёнными типами элементов, используется событие
over и проверка в колбэках:
draggable.on('over', (event) => {
const draggedElement = event.data.dragged;
const overContainer = event.data.overContainer;
if (!overContainer.classList.contains('allowed')) {
event.cancel();
}
});
Метод event.cancel() предотвращает вставку элемента в
недопустимый контейнер. Это эффективный способ контролировать
совместимость на уровне логики приложения.
Помимо проверки контейнеров, важно контролировать внутреннюю структуру перетаскиваемых элементов. Например, если элемент содержит вложенные компоненты, которые не должны быть перемещены отдельно:
draggable.on('drag:start', (event) => {
const nested = event.data.source.querySelector('.non-draggable');
if (nested) {
event.cancel();
}
});
Такой подход предотвращает ошибки при попытке перемещения элементов, не предназначенных для взаимодействия.
Draggable поддерживает фильтры, позволяющие динамически определять
совместимость элементов. Свойство handle используется для
указания частей элемента, за которые разрешено захватывать объект:
const draggable = new Draggable(document.querySelectorAll('.container'), {
draggable: '.item',
handle: '.handle'
});
Использование handle снижает риск случайного перемещения
несовместимых компонентов и повышает контроль над интерфейсом.
Для полной совместимости важно учитывать, что Draggable опирается на события Pointer Events и HTML5 Drag and Drop. Проверка доступности функционала выполняется через feature detection:
if (!window.PointerEvent) {
console.warn('Draggable требует поддержку Pointer Events для корректной работы.');
}
Это гарантирует, что библиотека будет использоваться только в поддерживаемых средах, предотвращая ошибки в старых браузерах.
При работе с динамическими компонентами, созданными с помощью фреймворков (React, Vue, Angular), необходимо проверять совместимость элементов после их рендера. Например, можно обновлять список контейнеров и элементов после изменения DOM:
draggable.destroy();
draggable = new Draggable(document.querySelectorAll('.updated-container'), {
draggable: '.updated-item'
});
Это гарантирует, что новые элементы корректно обрабатываются и валидация совместимости не нарушается.
over, drag:start,
drag:move для динамической проверки допустимости
операций.handle для ограничения областей захвата
элемента.Эти практики обеспечивают устойчивую работу Draggable в сложных интерфейсах и предотвращают ошибки, связанные с несовместимостью элементов и контейнеров.