SortableJS — мощная библиотека для реализации интерактивной сортировки элементов на странице. Одной из ключевых возможностей является контроль над перемещениями элементов. Валидация перемещений позволяет ограничивать перемещения по определённым правилам, предотвращать нежелательные изменения порядка и управлять логикой перетаскивания на лету.
Основной инструмент для валидации перемещений — событие
onMove. Оно вызывается каждый раз при попытке
переместить элемент в новую позицию. Событие позволяет
определить, разрешить или запретить перемещение, возвращая
true для разрешения и false для запрета.
Пример базовой настройки:
const sortable = new Sortable(list, {
onMove: function (evt, originalEvent) {
// evt.related - элемент, перед которым планируется вставка
// evt.dragged - перемещаемый элемент
// запретить перемещение элементов с классом "locked"
return !evt.dragged.classList.contains('locked');
}
});
Ключевые моменты onMove:
evt.dragged — элемент, который перемещается.evt.related — элемент, перед которым планируется
вставка.evt.willInsertAfter — булевое значение, указывающее,
будет ли вставка после related.true/false определяет возможность
перемещения.SortableJS позволяет создавать группы, управлять
переносом элементов между ними и задавать правила валидации для этих
операций. Свойство group содержит несколько важных
параметров:
name — имя группы.pull — управляет возможностью перемещения элемента из
этой группы. Может быть true, false,
"clone" или функция для динамической проверки.put — управляет возможностью вставки элемента в группу.
Может быть true, false или функция.Пример ограничения вставки только определённых элементов:
const sortableA = new Sortable(listA, {
group: {
name: 'shared',
pull: true,
put: function (to, from, dragged) {
// Разрешить вставку только элементов с классом "allowed"
return dragged.classList.contains('allowed');
}
}
});
const sortableB = new Sortable(listB, {
group: 'shared'
});
Особенности функций put и
pull:
dragged — элемент, который перемещается.from — исходный список.to — целевой список.true/false контролирует
возможность перемещения.Валидация перемещений может зависеть от состояния страницы, пользовательских условий или данных, связанных с элементами. Например, можно запрещать перемещение элементов на нечётные позиции или в зависимости от атрибутов:
onMove: function(evt) {
const index = Array.from(evt.from.children).indexOf(evt.related);
const canMove = index % 2 === 0; // разрешаем вставку только на чётные позиции
return canMove;
}
Это позволяет строить гибкую и точную логику перетаскивания, включая ограничения по типам, категориям и приоритетам элементов.
SortableJS поддерживает использование функций в onMove и
put, которые могут возвращать результат после выполнения
асинхронных операций, например, проверки на сервере. Для этого можно
использовать промисы:
onMove: function(evt) {
return fetch('/api/check-move', {
method: 'POST',
body: JSON.stringify({
draggedId: evt.dragged.dataset.id,
targetId: evt.related.dataset.id
}),
headers: {'Content-Type': 'application/json'}
})
.then(response => response.json())
.then(data => data.canMove);
}
Такой подход позволяет интегрировать SortableJS в сложные бизнес-правила и обеспечивать серверную валидацию перед изменением порядка элементов.
При запрете перемещения через onMove или
put важно правильно управлять визуальными эффектами. Для
этого можно использовать CSS-классы и события библиотеки:
onMove: function(evt) {
const canMove = !evt.dragged.classList.contains('locked');
evt.related.classList.toggle('highlight-denied', !canMove);
return canMove;
}
Рекомендации по UX:
Совмещение onMove, групп, put и
pull позволяет строить сложные сценарии:
Эта гибкость делает SortableJS универсальным инструментом для реализации интерактивных и безопасных интерфейсов сортировки.