Библиотека Masonry реализует систему пользовательских событий, позволяющую отслеживать внутренние процессы раскладки элементов. События используются для синхронизации интерфейса, выполнения дополнительной логики после перерасчёта сетки, интеграции с другими библиотеками и управления жизненным циклом компонентов.
Подписка и отписка от событий выполняется через методы
on и off.
Эти методы предоставляются базовым механизмом событий, встроенным в
архитектуру Masonry.
onМетод on регистрирует обработчик
события. После регистрации функция-обработчик вызывается каждый раз,
когда указанное событие происходит внутри экземпляра Masonry.
masonryInstance.on( eventName, listener )
Параметры
| Параметр | Тип | Описание |
|---|---|---|
eventName |
String | Имя события |
listener |
Function | Функция-обработчик |
layoutCompleteСобытие layoutComplete срабатывает
после завершения расчёта и применения расположения элементов.
var grid = document.querySelector('.grid');
var msnry = new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: 200
});
msnry.on('layoutComplete', function(items) {
console.log('Раскладка завершена');
console.log('Количество элементов:', items.length);
});
Особенности события
Для одного экземпляра Masonry может быть зарегистрировано любое количество обработчиков.
msnry.on('layoutComplete', function() {
console.log('layoutComplete');
});
msnry.on('removeComplete', function() {
console.log('removeComplete');
});
Каждый обработчик сохраняется во внутреннем списке слушателей.
layoutCompleteСрабатывает после завершения процесса раскладки.
msnry.on('layoutComplete', function(items) {
console.log('Размещено элементов:', items.length);
});
Используется для:
removeCompleteВызывается после удаления элементов из сетки.
msnry.on('removeComplete', function(items) {
console.log('Удалено:', items.length);
});
Применение:
offМетод off удаляет ранее
зарегистрированный обработчик события.
masonryInstance.off( eventName, listener )
Параметры
| Параметр | Тип | Описание |
|---|---|---|
eventName |
String | Имя события |
listener |
Function | Функция, ранее переданная в on |
Удаление выполняется только при передаче той же самой функции, которая использовалась при подписке.
function onLayout(items) {
console.log('Layout complete');
}
msnry.on('layoutComplete', onLayout);
// позже
msnry.off('layoutComplete', onLayout);
После вызова off обработчик больше не вызывается.
offОтписка от событий важна в следующих ситуациях:
1. Удаление компонентов
При уничтожении интерфейсного блока необходимо удалить слушатели, чтобы избежать обращений к несуществующим DOM-элементам.
2. Предотвращение утечек памяти
Если объект Masonry живёт дольше, чем компонент интерфейса, оставшиеся обработчики могут удерживать ссылки на ненужные данные.
3. Временное отключение логики
Иногда требуется временно остановить реакцию на событие.
var grid = document.querySelector('.grid');
var msnry = new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: 200
});
function handleLayout(items) {
console.log('Layout finished:', items.length);
}
msnry.on('layoutComplete', handleLayout);
setTimeout(function() {
msnry.off('layoutComplete', handleLayout);
console.log('Обработчик отключён');
}, 5000);
Поведение:
Для корректной работы off необходимо сохранять ссылку на
функцию-обработчик.
msnry.on('layoutComplete', function() {
console.log('done');
});
msnry.off('layoutComplete', function() {
console.log('done');
});
Отписка не произойдёт, поскольку это два разных объекта функции.
function handler() {
console.log('done');
}
msnry.on('layoutComplete', handler);
msnry.off('layoutComplete', handler);
Слушатели можно регистрировать сразу после создания экземпляра Masonry.
var msnry = new Masonry('.grid');
msnry.on('layoutComplete', function() {
console.log('Первичная раскладка завершена');
});
Первый вызов события произойдёт после начального
layout.
События часто используются совместно с методами управления элементами.
msnry.on('layoutComplete', function(items) {
console.log('Обновление интерфейса');
});
msnry.appended(newItems);
msnry.layout();
Последовательность:
layoutCompleteСовременный синтаксис JavaScript допускает использование стрелочных функций.
msnry.on('layoutComplete', (items) => {
console.log(items.length);
});
Однако при необходимости удаления обработчика стрелочную функцию необходимо сохранить в переменную.
При полном удалении экземпляра рекомендуется предварительно убрать обработчики.
function layoutHandler() {
console.log('layout');
}
msnry.on('layoutComplete', layoutHandler);
msnry.off('layoutComplete', layoutHandler);
msnry.destroy();
Такая последовательность гарантирует корректное освобождение ресурсов.
on и offMasonry использует простой механизм событийного эмиттера:
on добавляет функцию в массивoff удаляет функцию из массиваУпрощённая схема:
listeners = {
layoutComplete: [fn1, fn2, fn3],
removeComplete: [fn4]
}
При генерации события layoutComplete выполняются
fn1, fn2, fn3.
При большом количестве событий часто применяют структурированный подход.
var handlers = {
layoutComplete(items) {
console.log('layout', items.length);
},
removeComplete(items) {
console.log('removed', items.length);
}
};
msnry.on('layoutComplete', handlers.layoutComplete);
msnry.on('removeComplete', handlers.removeComplete);
Это упрощает управление обработчиками и их последующее удаление.
Одна из распространённых задач — синхронизация Masonry с другими компонентами страницы.
Пример: обновление индикатора загрузки.
loader.show();
msnry.on('layoutComplete', function() {
loader.hide();
});
Пока выполняется расчёт сетки, отображается индикатор. После завершения раскладки он скрывается.
Если необходимо удалить конкретный обработчик,
используется стандартный off. Если требуется полностью
отключить реакцию на событие, можно удалить все функции вручную через
управление ссылками.
Практический подход — хранить массив обработчиков и удалять их в цикле.
handlers.forEach(function(handler) {
msnry.off('layoutComplete', handler);
});
Методы on и off позволяют использовать
Masonry как часть более сложной архитектуры интерфейса:
Система событий превращает библиотеку из простого алгоритма раскладки в управляемый элемент интерфейсной логики.