SortableJS — мощная библиотека для реализации перетаскивания
элементов списков с полной поддержкой drag-and-drop. Среди множества
событий, предоставляемых библиотекой, особое значение имеют
onChange и
onFilter, поскольку они позволяют
контролировать изменения порядка элементов и ограничивать действия
пользователя на уровне логики приложения.
Событие onChange вызывается при любом
изменении порядка элементов в списке. Оно предоставляет доступ к
информации о текущем состоянии элементов, что позволяет динамически
обновлять данные, связанные с порядком элементов, например, массив
объектов или индексные значения в базе данных.
new Sortable(listElement, {
onChange: function(evt) {
console.log('Элемент перемещен');
console.log('Элемент:', evt.item);
console.log('Новый индекс:', evt.newIndex);
console.log('Старый индекс:', evt.oldIndex);
}
});
evt.item — DOM-элемент, который был
перемещен.evt.oldIndex — индекс элемента до
перемещения.evt.newIndex — индекс элемента после
перемещения.evt.from — родительский контейнер, из
которого элемент был перемещен.evt.to — родительский контейнер, в
который элемент был перемещен.onChange позволяет синхронизировать массив с визуальным
порядком.onChange, лучше использовать делегирование или
debounce.evt.from и evt.to, чтобы корректно обновлять
соответствующие массивы данных.Событие onFilter срабатывает при
попытке перетащить или удалить элемент, который помечен как
фильтруемый, например с помощью CSS-класса или
селектора, определенного в опции filter. Оно позволяет
блокировать определённые действия для выбранных элементов.
new Sortable(listElement, {
filter: '.disabled',
onFilter: function(evt) {
console.log('Попытка взаимодействия с фильтруемым элементом');
console.log('Элемент:', evt.item);
}
});
filter — CSS-селектор или функция,
возвращающая true для элементов, которые должны быть заблокированы.evt.item — DOM-элемент, с которым
произошло взаимодействие.evt.preventDefault() — можно
использовать для предотвращения стандартного действия библиотеки.new Sortable(listElement, {
filter: function(evtItem) {
return evtItem.classList.contains('locked');
},
onFilter: function(evt) {
alert('Этот элемент заблокирован для перемещения');
}
});
filter получает текущий элемент и возвращает
true, если он заблокирован.onFilter можно реализовать любые уведомления,
логирование или визуальные подсказки.Эти события часто используются совместно для полной логики управления списками:
onFilter ограничивает возможность перетаскивания
определённых элементов.onChange фиксирует только допустимые перемещения, что
позволяет поддерживать актуальную последовательность данных.new Sortable(listElement, {
filter: '.locked',
onFilter: function(evt) {
console.warn('Перемещение заблокировано:', evt.item.textContent);
},
onChange: function(evt) {
console.log('Элемент успешно перемещен:', evt.item.textContent);
}
});
Такой подход обеспечивает чистое разделение обязанностей: фильтрация контролирует доступ, а изменение порядка фиксирует результат.
onChange и onFilter снижает нагрузку на
браузер при большом количестве элементов.Если требуется, могу подготовить отдельный блок с реальными
сценариями использования onChange и onFilter в
крупном приложении, включая обновление нескольких списков и
интеграцию с базой данных. Это будет выглядеть как полноценный учебный
пример с кодом.