Событие data_ready относится к внутреннему жизненному
циклу анимации в Lottie Web и сигнализирует о моменте, когда JSON-данные
анимации полностью загружены, распарсены и преобразованы во внутреннюю
структуру, пригодную для дальнейшего построения рендера. На этом этапе
сама анимация ещё не обязательно отрисована в DOM, но все ключевые
данные уже доступны для работы API и модификации.
При инициализации анимации через lottie.loadAnimation
происходит несколько последовательных стадий:
Событие data_ready возникает после завершения этапов
загрузки и парсинга, но до полной готовности DOM-рендера.
На этом уровне уже доступны:
animationData)data_ready от других событийВ Lottie Web существует несколько ключевых событий жизненного цикла:
data_readyDOMLoadedcompleteloopCompleteenterFramedata_ready отличается тем, что он не связан с DOM
напрямую.
data_ready vs
DOMLoadedDOMLoaded сигнализирует, что:
data_ready происходит раньше:
Таким образом:
data_ready — данные готовыDOMLoaded — интерфейс готовdata_readyСобытие доступно через стандартную систему событий Lottie instance:
const animation = lottie.loadAnimation({
container: document.getElementById('anim'),
renderer: 'svg',
loop: true,
autoplay: false,
path: 'animation.json'
});
animation.addEventListener('data_ready', () => {
console.log('Данные анимации загружены и распарсены');
});
В этом моменте можно безопасно работать с:
animation.animationDataanimation.totalFramesanimation.frameRateanimation.firstFramedata_readyСобытие используется в случаях, когда требуется доступ к структуре анимации до её визуализации.
Типичные сценарии:
animation.addEventListener('data_ready', () => {
const duration = animation.getDuration();
const frames = animation.totalFrames;
if (frames > 300) {
console.warn('Анимация слишком длинная');
}
});
До начала рендера можно изменить поведение анимации:
animation.addEventListener('data_ready', () => {
animation.setSpeed(1.5);
animation.loop = false;
});
animation.addEventListener('data_ready', () => {
document.getElementById('loader').style.display = 'none';
document.getElementById('anim').style.visibility = 'visible';
});
Lottie Web обрабатывает JSON через собственный парсер AE-экспорта. После загрузки:
AnimationItemAnimationParserLayer)EffectsManager)После успешного завершения этого pipeline вызывается:
this.trigger('data_ready');
Это означает, что событие не связано с браузерным API, а является частью внутренней системы событий Lottie.
animationDataПосле data_ready гарантируется наличие:
animation.animationData
Структура включает:
layers — массив слоёвassets — внешние ресурсыfr — frame rateip, op — начало и конец анимацииw, h — размеры композицииПример анализа:
animation.addEventListener('data_ready', () => {
const data = animation.animationData;
console.log('FPS:', data.fr);
console.log('Размер:', data.w, data.h);
console.log('Слоёв:', data.layers.length);
});
Несмотря на доступность данных, в этом состоянии существуют ограничения:
renderer: 'canvas')play() может не дать визуального результатаcurrentFrame может быть не инициализирован
корректноПоэтому любые операции, связанные с визуальным изменением DOM,
следует выполнять только после DOMLoaded.
При загрузке через URL событие становится особенно важным:
const animation = lottie.loadAnimation({
container: document.getElementById('anim'),
renderer: 'svg',
autoplay: false,
path: '/animations/intro.json'
});
animation.addEventListener('data_ready', () => {
initializeAnalytics(animation.animationData);
});
При этом момент вызова зависит от:
Хотя Lottie Web не предоставляет Promise API по умолчанию,
data_ready часто используется для его эмуляции:
function loadLottie(path) {
return new Promise((resolve) => {
const anim = lottie.loadAnimation({
container: document.createElement('div'),
renderer: 'svg',
autoplay: false,
path
});
anim.addEventListener('data_ready', () => {
resolve(anim);
});
});
}
Такой подход позволяет гарантировать доступ к структуре до дальнейших действий.
data_ready → подготовлены SVG-ноды, но не
вставленыСамо событие не является тяжёлым, но момент его возникновения может совпадать с пиковой нагрузкой:
При большом количестве анимаций одновременное возникновение
data_ready может вызывать кратковременные лаги, особенно в
мобильных браузерах.
animation.addEventListener('data_ready', () => {
document.querySelector('.layer').style.opacity = 1; // может не существовать
});
animation.addEventListener('data_ready', () => {
console.log(animation.isPaused); // состояние ещё не финализировано
});
При повторных вызовах loadAnimation без очистки
контейнера событие может сработать несколько раз в разных
экземплярах.
Для одной анимации последовательность чаще всего выглядит так:
config_ready (внутреннее)data_readyDOMLoadedenterFramecomplete (при autoplay или проигрывании)data_ready часто применяется как точка контроля
корректности JSON:
animation.addEventListener('data_ready', () => {
if (!animation.animationData.layers.length) {
console.error('Пустая композиция');
}
});
Это позволяет выявлять:
После наступления data_ready можно безопасно
применять:
goToAndStopsetSpeedsetDirectionplaySegmentsПример:
animation.addEventListener('data_ready', () => {
animation.goToAndStop(10, true);
animation.setSpeed(2);
});
Если вызывается destroy() и создаётся новая анимация,
data_ready срабатывает заново для каждого экземпляра
независимо. Событие не кэшируется и не сохраняется между инстансами.