В библиотеке Shopify Draggable метод
preventDefault используется для управления поведением
событий перетаскивания на уровне браузера и самого Draggable. Этот метод
позволяет отменять стандартные действия браузера, такие
как выделение текста при перетаскивании, скроллинг страницы, а также
предотвращать выполнение дефолтных обработчиков событий, которые могут
конфликтовать с логикой перетаскивания.
В контексте Draggable preventDefault особенно важен для
точного контроля над drag-and-drop событиями, включая
drag:start, drag:move, drag:stop
и другие.
Draggable предоставляет удобные события с объектом
event, который содержит метод preventDefault.
Типичный синтаксис выглядит так:
const container = document.querySelector('.draggable-container');
const draggable = new Draggable(container, {
draggable: '.item'
});
draggable.on('drag:start', (event) => {
event.preventDefault();
});
В этом примере вызов event.preventDefault()
останавливает выполнение всех стандартных действий
браузера, связанных с началом перетаскивания.
Ключевые моменты использования:
drag:start – предотвращает автоматическое поведение при
старте перетаскивания.drag:move – может блокировать нежелательные изменения
положения элементов, если используется кастомная логика
перемещения.drag:stop – предотвращает дефолтное завершение события,
например, если необходимо реализовать анимацию возврата элемента на
исходную позицию.При работе с Draggable часто возникают конфликты со стандартными событиями браузера, например:
Использование preventDefault() внутри событий Draggable
полностью решает эти проблемы. Пример:
draggable.on('drag:move', (event) => {
event.preventDefault(); // блокируем стандартное поведение
const { x, y } = event.sensorEvent;
event.source.style.transform = `translate(${x}px, ${y}px)`;
});
Здесь preventDefault() обеспечивает плавное
кастомное перемещение элемента без внезапного скролла или
выделения текста.
Draggable поддерживает несколько сенсоров: MouseSensor,
TouchSensor, Sensor,
SortableSensor.
Для любого сенсора вызов preventDefault() на событии
сенсора предотвращает дефолтное поведение устройства. Например, для
сенсора TouchSensor на мобильных устройствах:
import { Draggable, TouchSensor } from '@shopify/draggable';
const draggable = new Draggable(document.querySelectorAll('.list'), {
draggable: '.item',
sensors: [TouchSensor]
});
draggable.on('drag:start', (event) => {
event.preventDefault(); // блокируем скролл страницы при касании
});
Эффект: элемент перемещается плавно, а страница не скроллится во время drag.
При использовании Draggable для сортировки элементов
вызов preventDefault() на событиях
sortable:sort или sortable:sorted позволяет
полностью контролировать поведение элементов без вмешательства
браузера:
draggable.on('sortable:sort', (event) => {
event.preventDefault(); // предотвращаем дефолтное поведение
console.log('Сортировка началась для элемента:', event.source);
});
Здесь предотвращается возможное нежелательное перемещение элемента, позволяя реализовать кастомную анимацию и логику сортировки.
drag:start, чтобы исключить конфликт со стандартными
drag-and-drop браузера.TouchSensor для предотвращения скролла страницы во время
drag.preventDefault() безопасен даже при использовании
нескольких сенсоров одновременно.mirror (копия перетаскиваемого
элемента) preventDefault() предотвращает стандартное
перемещение оригинального элемента браузером, сохраняя контроль над
зеркалом.Метод preventDefault() в Shopify Draggable является
ключевым инструментом для тонкой настройки drag-and-drop
интерфейсов, предотвращая конфликты со стандартным поведением
браузера и позволяя полностью контролировать визуальные и логические
аспекты перетаскивания и сортировки элементов.