SortableJS — это мощная библиотека для реализации перетаскивания элементов в списках и сетках на веб-странице. Она работает напрямую с DOM-элементами и предоставляет гибкий API для управления поведением перетаскивания, а также для контроля событий и взаимодействий между элементами.
Каждый элемент списка в SortableJS является частью контейнера
(например, <ul> или <div>),
который инициализируется с помощью конструктора Sortable.
Контейнер и его элементы управляются через конфигурационные опции,
события и методы, которые позволяют добавлять, удалять или изменять
порядок элементов динамически.
closest и его роль в SortableJSМетод closest — стандартный DOM-метод, который
возвращает ближайший родительский элемент (включая сам элемент),
удовлетворяющий CSS-селектору. В контексте SortableJS он используется
для определения контейнера или родителя, к которому привязан элемент, а
также для фильтрации элементов при обработке событий перетаскивания.
Синтаксис метода:
element.closest(selector)
element — DOM-элемент, на котором вызывается
метод.selector — строка CSS-селектора, которая задает
критерий поиска родителя.null, если подходящего родителя не найдено.Пример использования в SortableJS:
const sortableList = document.querySelector('#myList');
sortableList.addEventListener('start', function (event) {
const closestItem = event.item.closest('li');
console.log('Начато перетаскивание элемента:', closestItem.textContent);
});
В этом примере closest('li') позволяет точно определить,
какой элемент списка был захвачен пользователем для перетаскивания. Это
важно для динамических списков, где внутри элемента могут быть вложенные
блоки или кнопки.
closest для фильтрации элементовSortableJS предоставляет опцию filter, которая
используется для исключения элементов из перетаскивания. Метод
closest облегчает проверку, принадлежит ли элемент к
фильтруемому блоку.
new Sortable(document.getElementById('myList'), {
filter: '.no-drag',
onMove: function (evt) {
return !evt.related.closest('.no-drag');
}
});
Здесь evt.related.closest('.no-drag') проверяет,
находится ли элемент или его родительский контейнер внутри блока,
который запрещен для перетаскивания.
closestSortableJS генерирует множество событий: start,
end, add, update,
remove, sort и др. Использование
closest в обработчиках событий позволяет точно определять
контекст действия, что особенно важно при сложной структуре DOM.
Пример: отслеживание обновления позиции элемента
const sortable = new Sortable(document.getElementById('taskList'), {
animation: 150,
onUpdate: function (evt) {
const movedItem = evt.item.closest('.task-item');
const newIndex = evt.newIndex;
console.log(`Элемент "${movedItem.textContent}" перемещен на позицию ${newIndex}`);
}
});
Здесь closest('.task-item') гарантирует, что даже если
элемент содержит вложенные кнопки или иконки, будет корректно выбран сам
элемент задачи.
closest с вложенными контейнерамиSortableJS поддерживает вложенные списки через опцию
group. Когда элементы могут перемещаться между
контейнерами, closest помогает определить, к какому
контейнеру относится элемент в данный момент.
new Sortable(document.querySelectorAll('.nested-list'), {
group: 'shared',
onAdd: function (evt) {
const parentList = evt.to.closest('.nested-list');
console.log('Элемент добавлен в список:', parentList.id);
}
});
В этом случае closest('.nested-list') позволяет
идентифицировать контейнер, в который элемент был перемещен, даже если
структура DOM сложная.
closest для всех операций, где элемент
может содержать вложенные дочерние узлы, чтобы избежать выбора
неправильного DOM-узла.closest с опциями SortableJS
filter и handle для точного контроля
перетаскивания.closest при работе с событиями
onUpdate, onAdd, onMove и других,
чтобы получать корректный элемент и его родительский контейнер.Метод closest обеспечивает точное взаимодействие с DOM в
динамических и вложенных структурах SortableJS, позволяя избегать ошибок
при идентификации элементов и контроле их положения.