Событие removeComplete используется для отслеживания
завершения удаления элементов из сетки. Оно срабатывает после того, как
элементы полностью удалены из внутренней структуры Masonry и после
завершения всех связанных с этим операций перерасчёта и анимации.
Это событие позволяет синхронизировать дополнительные действия интерфейса с окончанием удаления: обновление данных, подгрузку новых элементов, изменение состояния интерфейса или запуск других визуальных эффектов.
Удаление элементов в Masonry происходит не напрямую через DOM, а через внутренний API библиотеки. Стандартная последовательность выглядит следующим образом:
remove.layout.removeComplete.Пример последовательности:
var msnry = new Masonry('.grid');
var items = document.querySelectorAll('.grid-item.to-remove');
msnry.remove(items);
msnry.layout();
После выполнения этих операций Masonry запускает событие
removeComplete.
Событие выполняет несколько важных функций:
Это особенно важно при использовании CSS-переходов и плавных перестроений сетки.
Для отслеживания события используется метод on.
msnry.on('removeComplete', function(removedItems) {
console.log('Удаление завершено');
});
Функция-обработчик получает аргумент removedItems,
содержащий список удалённых элементов.
removedItemsАргумент removedItems представляет собой массив объектов
Masonry Item. Каждый объект содержит информацию об удалённом
элементе.
Структура объекта:
element — DOM-элементposition — последняя позиция в сеткеsize — размеры элементаПример доступа к DOM-элементам:
msnry.on('removeComplete', function(removedItems) {
removedItems.forEach(function(item) {
console.log(item.element);
});
});
var grid = document.querySelector('.grid');
var msnry = new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: 200,
gutter: 10
});
var removeButton = document.querySelector('#remove-items');
removeButton.addEventListener('click', function() {
var items = grid.querySelectorAll('.grid-item.remove');
msnry.remove(items);
msnry.layout();
});
msnry.on('removeComplete', function(removedItems) {
removedItems.forEach(function(item) {
console.log('Удалён элемент:', item.element);
});
});
Алгоритм работы:
remove() удаляет их из Masonry.layout() перестраивает сетку.removeComplete.remove и removeCompleteВажно различать метод удаления и событие завершения удаления.
| Элемент | Назначение |
|---|---|
remove() |
удаляет элементы из Masonry |
layout() |
перестраивает сетку |
removeComplete |
сообщает о завершении процесса |
Метод remove() выполняется мгновенно, а событие
removeComplete может происходить позже, особенно при
включённых анимациях.
Если используются CSS-переходы, перестроение сетки может занимать время. В этот период DOM уже изменён, но визуальная перестройка ещё продолжается.
Событие removeComplete возникает только после окончания
анимации.
Это позволяет:
Пример задержки выполнения логики:
msnry.on('removeComplete', function() {
loadMoreItems();
});
Событие работает одинаково для одного и для множества элементов.
var item = document.querySelector('.grid-item');
msnry.remove(item);
msnry.layout();
Обработчик:
msnry.on('removeComplete', function(removedItems) {
console.log(removedItems.length);
});
В этом случае removedItems.length будет равен
1.
Masonry поддерживает передачу NodeList, массива или
одиночного элемента.
var items = document.querySelectorAll('.grid-item.old');
msnry.remove(items);
msnry.layout();
После завершения:
msnry.on('removeComplete', function(items) {
console.log('Удалено элементов:', items.length);
});
Событие удобно использовать для синхронизации UI.
Например, скрытие панели управления, если элементов больше нет.
msnry.on('removeComplete', function() {
var remaining = document.querySelectorAll('.grid-item');
if (remaining.length === 0) {
document.querySelector('.controls').style.display = 'none';
}
});
После удаления часто выполняется загрузка новых элементов.
msnry.on('removeComplete', function() {
fetch('/items')
.then(response => response.json())
.then(data => addItems(data));
});
Это гарантирует, что новая загрузка не начнётся до завершения перестройки сетки.
Распространённый подход — сначала выполнить CSS-анимацию, а затем удалить элемент.
var items = document.querySelectorAll('.grid-item');
items.forEach(function(item) {
item.classList.add('fade-out');
});
После окончания анимации:
setTimeout(function() {
msnry.remove(items);
msnry.layout();
}, 300);
Событие removeComplete позволит продолжить работу после
окончательного удаления.
onceИногда требуется одноразовый обработчик.
msnry.once('removeComplete', function() {
console.log('Удаление завершено один раз');
});
После первого срабатывания обработчик автоматически удаляется.
layout()После remove() необходимо выполнить перестройку.
Неправильно:
msnry.remove(items);
Правильно:
msnry.remove(items);
msnry.layout();
Без layout() событие removeComplete может
не сработать.
Нельзя удалять элементы напрямую через DOM, минуя Masonry.
Неправильно:
element.remove();
Это нарушает внутреннюю структуру библиотеки.
Правильно:
msnry.remove(element);
msnry.layout();
Частая ошибка — выполнение действий сразу после
remove().
msnry.remove(items);
updateInterface();
Корректный подход:
msnry.remove(items);
msnry.layout();
msnry.once('removeComplete', updateInterface);
Masonry предоставляет несколько событий, связанных с изменением структуры:
| Событие | Назначение |
|---|---|
layoutComplete |
завершение перестроения |
removeComplete |
завершение удаления |
appendComplete |
завершение добавления |
Комбинация событий позволяет построить сложную логику управления сеткой.
Пример:
msnry.on('removeComplete', function() {
console.log('Элементы удалены');
});
msnry.on('layoutComplete', function() {
console.log('Сетка перестроена');
});
В интерфейсах с большим количеством динамических операций
(SPA, бесконечная прокрутка, фильтрация контента) событие
removeComplete играет роль точки синхронизации между
состоянием данных и визуальным представлением.
Типичный цикл работы:
removeCompleteТакой подход обеспечивает предсказуемое и стабильное поведение интерфейса даже при большом количестве операций изменения DOM.