Событие droppable:stop является одним из ключевых
событий в библиотеке Shopify Draggable, отвечающих за
завершение взаимодействия с дроп-зоной. Оно срабатывает после
того, как элемент был отпущен, вне зависимости от того, был ли
он успешно перемещён в допустимую дроп-зону или нет. Это событие
позволяет выполнить действия по очистке состояния, сбросу стилей или
дополнительной логике после завершения драг-н-дроп операции.
draggable.on('droppable:stop', function(event) {
console.log(event);
});
draggable — экземпляр Draggable.event — объект события, содержащий всю
информацию о дроп-операции.Объект события droppable:stop включает следующие
ключевые свойства:
source — элемент, который был
перетянут.mirror — клон перетаскиваемого
элемента, который создаётся для визуального перемещения.sensorEvent — исходное событие мыши
или сенсорного устройства.over — дроп-зона, над которой
находился элемент на момент отпускания, либо null, если
элемент не был над дроп-зоной.originalSource — исходный DOM-элемент,
с которого началось перетаскивание.Пример для логирования всех ключевых параметров:
draggable.on('droppable:stop', event => {
console.log('Источник:', event.source);
console.log('Клон элемента:', event.mirror);
console.log('Дроп-зона:', event.over);
console.log('Оригинальный элемент:', event.originalSource);
});
Событие droppable:stop отличается от:
droppable:over — срабатывает при
наведении на дроп-зону.droppable:out — срабатывает при выходе
элемента из дроп-зоны.droppable:drop — срабатывает только
если элемент был успешно отпущен над дроп-зоной.droppable:stop всегда срабатывает, независимо от того,
произошло ли успешное падение в дроп-зону, что делает его идеальным для
финальных действий по очистке состояния.
draggable.on('droppable:stop', event => {
if (event.over) {
event.over.style.border = '';
}
event.source.style.opacity = '';
});
draggable.on('droppable:stop', event => {
event.source.classList.remove('dragging');
if (event.mirror) {
event.mirror.remove();
}
});
draggable.on('droppable:stop', event => {
console.log(`Элемент ${event.source.id} был перемещен.`);
if (event.over) {
console.log(`Элемент оказался над дроп-зоной ${event.over.id}`);
} else {
console.log('Элемент не попал в дроп-зону');
}
});
droppable:stop для действий, которые
должны выполняться вне зависимости от успешного
дропа.droppable:drop, чтобы не создавать
конфликтов визуального состояния.droppable:over и
droppable:out для построения комплексной логики подсветки и
отката.mirror элементомmirror — это клон перетаскиваемого элемента, который
отображается поверх страницы. В droppable:stop можно
безопасно удалять или изменять его, так как операция перетаскивания
завершается:
draggable.on('droppable:stop', event => {
if (event.mirror) {
event.mirror.parentNode.removeChild(event.mirror);
}
});
Такой подход предотвращает появление “зависших” визуальных элементов после завершения перетаскивания.
Иногда элемент может быть отпущен за пределами допустимых дроп-зон. В
droppable:stop удобно обрабатывать такие случаи:
draggable.on('droppable:stop', event => {
if (!event.over) {
console.warn('Элемент отпущен вне дроп-зоны, возвращаем на место.');
event.source.style.transform = 'translate(0, 0)';
}
});
Это позволяет поддерживать консистентное состояние интерфейса и предотвращает “потерю” элементов.
droppable:drop,
droppable:over и droppable:out, обеспечивая
полное управление жизненным циклом драг-н-дроп операции.