SortableJS предоставляет мощный механизм для перетаскивания элементов
списка с использованием событий, которые позволяют отслеживать изменения
в порядке элементов и реагировать на действия пользователя. Среди
наиболее часто используемых событий — onUpdate и
onSort, каждое из которых выполняет конкретную задачу в
управлении сортировкой элементов.
Событие onUpdate срабатывает только тогда, когда
порядок элементов внутри контейнера изменился в результате
перетаскивания. Оно особенно полезно для синхронизации внутреннего
состояния данных с визуальным представлением списка.
Сигнатура события:
onUpdate: function (evt) {
// evt.item - перемещаемый элемент
// evt.oldIndex - исходная позиция элемента
// evt.newIndex - новая позиция элемента
// evt.from - контейнер, из которого был перемещён элемент
// evt.to - контейнер, в который элемент перемещён
}
Пример использования:
const list = document.getElementById('sortable-list');
Sortable.create(list, {
onUpdate: function (evt) {
console.log(`Элемент перемещён с позиции ${evt.oldIndex} на ${evt.newIndex}`);
const items = Array.from(list.children).map(li => li.textContent);
console.log('Текущий порядок элементов:', items);
}
});
Ключевые моменты:
onUpdate не срабатывает, если элемент
перетаскивается, но остаётся на той же позиции.evt доступен объект item, который
содержит ссылку на DOM-элемент, что позволяет напрямую работать с его
атрибутами или данными.Событие onSort активируется при любом изменении
порядка элементов, включая перемещения между контейнерами, и
даже если фактического изменения порядка не произошло, оно всё равно
срабатывает. Это делает его более общим по сравнению с
onUpdate.
Сигнатура события:
onSort: function (evt) {
// evt.item - перемещаемый элемент
// evt.oldIndex - исходная позиция элемента
// evt.newIndex - новая позиция элемента
// evt.from - контейнер, из которого элемент перетаскивался
// evt.to - контейнер, в который элемент помещён
// evt.clone - клон элемента при использовании clone
}
Пример использования:
Sortable.create(list, {
onSort: function (evt) {
console.log(`Элемент ${evt.item.textContent} был отсортирован`);
console.log(`Старый индекс: ${evt.oldIndex}, новый индекс: ${evt.newIndex}`);
}
});
Особенности onSort:
| Свойство | onUpdate | onSort |
|---|---|---|
| Срабатывает при | Фактическом изменении порядка элементов | Любой сортировке (даже без изменения позиции) |
| Многоконтейнерность | Поддерживается через evt.from и
evt.to |
Полностью поддерживается |
| Использование | Обновление данных после перемещения | Реакции во время сортировки, визуальные эффекты |
| Типичные задачи | Синхронизация с моделью данных | Ограничение перетаскивания, подсветка, контроль логики |
Часто на практике события onUpdate и onSort
применяются совместно: onSort для интерактивных эффектов,
onUpdate — для окончательного сохранения порядка
элементов.
Sortable.create(list, {
animation: 150,
onSort: function (evt) {
evt.item.style.backgroundColor = '#f0f0f0';
},
onUpdate: function (evt) {
evt.item.style.backgroundColor = '';
const newOrder = Array.from(list.children).map(li => li.dataset.id);
console.log('Новый порядок ID элементов:', newOrder);
}
});
В этом примере изменение фона происходит во время перетаскивания
через onSort, а обновление порядка данных и сброс стиля
происходит при завершении перемещения через onUpdate.
Array.prototype.splice вместе с evt.oldIndex и
evt.newIndex для перестановки элементов.onMove лучше использовать
совместно с onSort.animation вместе с событиями
onSort делает интерфейс более плавным и отзывчивым.evt.from и evt.to, чтобы корректно обновлять
данные соответствующих списков.Использование событий onUpdate и onSort в
SortableJS обеспечивает полный контроль над процессом сортировки
элементов: от визуальных эффектов до точного обновления внутренней
модели данных. Их грамотное сочетание позволяет строить сложные,
интерактивные интерфейсы с перетаскиваемыми элементами, не теряя
синхронизации с приложением.