Работа с событиями в Lottie Web строится вокруг объекта
AnimationItem, который возвращается после создания анимации
через lottie.loadAnimation. Этот объект содержит механизм
подписки и отписки от событий, а также методы жизненного цикла, влияющие
на очистку памяти и прекращение всех внутренних обработчиков.
Корректное удаление обработчиков событий критично при работе с динамически создаваемыми анимациями, SPA-интерфейсами и повторной инициализацией анимаций в одном DOM-контейнере.
Внутри Lottie Web используется событийная модель, где каждый экземпляр анимации хранит собственный список подписчиков. Подписка выполняется через:
addEventListener(eventName, callback)removeEventListener(eventName, callback)Каждое событие регистрируется в локальном реестре объекта анимации, а не глобально. Это означает, что утечки памяти возникают только при сохранении ссылок на callback или при отсутствии явной очистки экземпляра.
В Lottie Web используется набор стандартных событий жизненного цикла:
enterFrame — срабатывает при каждом кадре анимацииloopComplete — завершение цикла воспроизведенияcomplete — завершение всей анимации (если loop =
false)segmentStart — начало сегментаdata_ready — данные анимации загруженыDOMLoaded — DOM-анимация готова к отображениюdestroy — экземпляр уничтожаетсяКаждое из этих событий может иметь зарегистрированные обработчики, которые требуется удалять вручную при динамическом управлении анимациями.
Удаление происходит через передачу идентичной ссылки на функцию:
function onComplete() {
console.log('Animation completed');
}
animation.addEventListener('complete', onComplete);
// удаление обработчика
animation.removeEventListener('complete', onComplete);
Ключевой момент — ссылка на функцию должна совпадать. Анонимные функции невозможно удалить:
// Невозможно удалить
animation.addEventListener('complete', () => {
console.log('done');
});
Наиболее радикальный способ удаления всех событий связан с уничтожением экземпляра анимации:
animation.destroy();
Метод выполняет:
После вызова destroy объект становится непригодным для
дальнейшего использования.
При повторной инициализации анимации без очистки возникают типичные проблемы:
enterFrameОсобенно это проявляется при повторных вызовах
lottie.loadAnimation в одном и том же контейнере без
предварительного destroy.
При работе с динамическими интерфейсами важен полный цикл:
Пример корректной схемы:
let animation = lottie.loadAnimation({
container: document.getElementById('box'),
renderer: 'svg',
loop: true,
autoplay: true,
path: 'data.json'
});
function onFrame(e) {
console.log(e.currentTime);
}
animation.addEventListener('enterFrame', onFrame);
// очистка перед пересозданием
animation.removeEventListener('enterFrame', onFrame);
animation.destroy();
animation = null;
При loop: true события complete могут не
срабатывать, поэтому управление логикой завершения часто переносится
на:
loopCompleteenterFrame с проверкой состоянияУдаление обработчиков в таких случаях должно учитывать непрерывность цикла. Если обработчик связан с состоянием UI, он должен удаляться независимо от состояния проигрывания.
Lottie Web не выполняет автоматическую очистку DOM-контейнера при
повторном loadAnimation. Это приводит к накоплению
SVG/Canvas слоёв.
Типовой корректный паттерн:
if (animation) {
animation.destroy();
}
animation = lottie.loadAnimation({
container: containerEl,
renderer: 'svg',
loop: true,
autoplay: true,
path: 'animation.json'
});
Частое добавление и удаление обработчиков без необходимости может приводить к:
enterFrameОптимальная стратегия — минимизация динамических подписок и группировка логики в один обработчик.
В одностраничных приложениях (React, Vue, Angular) жизненный цикл компонентов напрямую влияет на корректность удаления обработчиков.
Ключевой принцип:
destroyОтсутствие очистки приводит к накоплению скрытых анимаций, даже если DOM-узел уже удалён.
После выполнения:
animation.destroy();
объект:
null внутренние поляПопытка повторного использования требует создания нового экземпляра
через lottie.loadAnimation.