;(function() {
window.createMeasureObserver = (measureName) => {
var markPrefix = `_uol-measure-${measureName}-${new Date().getTime()}`;
performance.mark(`${markPrefix}-start`);
return {
end: function() {
performance.mark(`${markPrefix}-end`);
performance.measure(`uol-measure-${measureName}`, `${markPrefix}-start`, `${markPrefix}-end`);
performance.clearMarks(`${markPrefix}-start`);
performance.clearMarks(`${markPrefix}-end`);
}
}
};
/**
* Gerenciador de eventos
*/
window.gevent = {
stack: [],
RUN_ONCE: true,
on: function(name, callback, once) {
this.stack.push([name, callback, !!once]);
},
emit: function(name, args) {
for (var i = this.stack.length, item; i--;) {
item = this.stack[i];
if (item[0] === name) {
item[1](args);
if (item[2]) {
this.stack.splice(i, 1);
}
}
}
}
};
var runningSearch = false;
var hadAnEvent = true;
var elementsToWatch = window.elementsToWatch = new Map();
var innerHeight = window.innerHeight;
// timestamp da última rodada do requestAnimationFrame
// É usado para limitar a procura por elementos visíveis.
var lastAnimationTS = 0;
// verifica se elemento está no viewport do usuário
var isElementInViewport = function(el) {
var rect = el.getBoundingClientRect();
var clientHeight = window.innerHeight || document.documentElement.clientHeight;
// renderizando antes, evitando troca de conteúdo visível no chartbeat-related-content
if(el.className.includes('related-content-front')) return true;
// garante que usa ao mínimo 280px de margem para fazer o lazyload
var margin = clientHeight + Math.max(280, clientHeight * 0.2);
// se a base do componente está acima da altura da tela do usuário, está oculto
if(rect.bottom < 0 && rect.bottom > margin * -1) {
return false;
}
// se o topo do elemento está abaixo da altura da tela do usuário, está oculto
if(rect.top > margin) {
return false;
}
// se a posição do topo é negativa, verifica se a altura dele ainda
// compensa o que já foi scrollado
if(rect.top < 0 && rect.height + rect.top < 0) {
return false;
}
return true;
};
var asynxNextFreeTime = () => {
return new Promise((resolve) => {
if(window.requestIdleCallback) {
window.requestIdleCallback(resolve, {
timeout: 5000,
});
} else {
window.requestAnimationFrame(resolve);
}
});
};
var asyncValidateIfElIsInViewPort = function(promise, el) {
return promise.then(() => {
if(el) {
if(isElementInViewport(el) == true) {
const cb = elementsToWatch.get(el);
// remove da lista para não ser disparado novamente
elementsToWatch.delete(el);
cb();
}
}
}).then(asynxNextFreeTime);
};
// inicia o fluxo de procura de elementos procurados
var look = function() {
if(window.requestIdleCallback) {
window.requestIdleCallback(findByVisibleElements, {
timeout: 5000,
});
} else {
window.requestAnimationFrame(findByVisibleElements);
}
};
var findByVisibleElements = function(ts) {
var elapsedSinceLast = ts - lastAnimationTS;
// se não teve nenhum evento que possa alterar a página
if(hadAnEvent == false) {
return look();
}
if(elementsToWatch.size == 0) {
return look();
}
if(runningSearch == true) {
return look();
}
// procura por elementos visíveis apenas 5x/seg
if(elapsedSinceLast < 1000/5) {
return look();
}
// atualiza o último ts
lastAnimationTS = ts;
// reseta status de scroll para não entrar novamente aqui
hadAnEvent = false;
// indica que está rodando a procura por elementos no viewport
runningSearch = true;
const done = Array.from(elementsToWatch.keys()).reduce(asyncValidateIfElIsInViewPort, Promise.resolve());
// obtém todos os elementos que podem ter view contabilizados
//elementsToWatch.forEach(function(cb, el) {
// if(isElementInViewport(el) == true) {
// // remove da lista para não ser disparado novamente
// elementsToWatch.delete(el);
// cb(el);
// }
//});
done.then(function() { runningSearch = false; });
// reinicia o fluxo de procura
look();
};
/**
* Quando o elemento `el` entrar no viewport (-20%), cb será disparado.
*/
window.lazyload = function(el, cb) {
if(el.nodeType != Node.ELEMENT_NODE) {
throw new Error("element parameter should be a Element Node");
}
if(typeof cb !== 'function') {
throw new Error("callback parameter should be a Function");
}
elementsToWatch.set(el, cb);
}
var setEvent = function() {
hadAnEvent = true;
};
window.addEventListener('scroll', setEvent, { capture: true, ive: true });
window.addEventListener('click', setEvent, { ive: true });
window.addEventListener('resize', setEvent, { ive: true });
window.addEventListener('load', setEvent, { once: true, ive: true });
window.addEventListener('DOMContentLoaded', setEvent, { once: true, ive: true });
window.gevent.on('allJSLoadedAndCreated', setEvent, window.gevent.RUN_ONCE);
// inicia a validação
look();
})();
O início da invasão da Ucrânia pela Rússia em 12 imagens
Mulher fica ferida em explosão de edifício durante ofensiva militar russa em Chuguiv, no leste da Ucrânia, na manhã de 24/2 Imagem: WOLFGANG SCHWAN/ANADOLU AGENCY VIA GETTY IMAGES
24/02/2022 15h59Atualizada em 24/02/2022 15h59
Após meses de expectativa e tensão, a Rússia deu início à invasão da Ucrânia nesta quinta-feira (24/2). Ainda não está clara a extensão da ofensiva militar, mas há relatos de explosões nas proximidades das principais cidades espalhadas pelo país. Ao menos sete pessoas morreram e outras 19 estão desaparecidas, segundo as autoridades russas.
O primeiro dia de invasão tem sido marcado por imagens de veículos militares da Rússia cruzando as fronteiras da Ucrânia (a partir do norte, do sul, do leste e do oeste do país), estragos causados por mísseis, pessoas feridas, fuga em massa por estradas e ferrovias, filas em caixas eletrônicos, voos civis cancelados e moradores procurando abrigos subterrâneos.
Segundo o presidente russo, Vladimir Putin, é questão de tempo até o início dos confrontos entre militares da Rússia e da Ucrânia.
Comboio russo invade a região ucraniana de Kherson a partir da Crimeia, região anexada pela Rússia em 2014
Imagem: REUTERS
Veículos militares da Rússia, incluindo blindados, têm sido vistos cruzando as fronteiras ao norte, ao sul, a oeste e a leste da Ucrânia
Imagem: -/BBC
Moradores de Kiev deixam a cidade logo após bombardeios que antecederam a invasão por terra de forças da Rússia e da Belarus, ao norte da Ucrânia; estima-se que o conflito cause o deslocamento de milhões de pessoas
Imagem: PIERRE CROM/GETTY IMAGES
Governo ucraniano tem pedido calma aos cidadãos, mas muitos têm deixado suas casas, armazenado produtos essenciais e esvaziado suas contas bancárias; há diversas filas em caixas eletrônicos
Imagem: REUTERS
Moradores da capital Kiev se refugiam em uma estação de metrô transformada em abrigo subterrâneo durante o conflito
Imagem: VALENTYN OGIRENKO/REUTERS
Focos de fogo e fumaça surgem em instalações militares em Chuhuiv, próxima a Kharkiv
Imagem: AFP
Ucrânia fechou o espaço aéreo, cancelando todos os voos civis por causa do "alto risco" à segurança
Imagem: REUTERS
Policiais inspecionam fragmentos de um míssil que caiu numa rua da capital Kiev, logo após Putin determinar a invasão da Ucrânia
Imagem: VALENTYN OGIRENKO/REUTERS
Imagem: BBC
Presidente Putin anuncia ofensiva militar em pronunciamento televisionado; ele instou os soldados ucranianos a se renderem e voltarem para casa --do contrário, a própria Ucrânia seria culpada pelo derramamento de sangue, e acrescentou que o conflito entre as forças russas e ucranianas são 'inevitáveis' e 'apenas uma questão de tempo'
Imagem: REUTERS
O presidente ucraniano, Volodymyr Zelensky, disse em pronunciamento que seu país estava pronto para um ataque russo; "Sem pânico. Nós somos fortes. Estamos prontos para qualquer coisa. Nós vamos derrotar qualquer um porque nós somos a Ucrânia"
ID: {{comments.info.id}}
URL: {{comments.info.url}}
Ocorreu um erro ao carregar os comentários.
Por favor, tente novamente mais tarde.
{{comments.total}} Comentário
{{comments.total}} Comentários
Seja o primeiro a comentar
Essa discussão está encerrada
Não é possivel enviar novos comentários.
Essa área é exclusiva para você, , ler e comentar.
Só s do UOL podem comentar
Ainda não é ? Assine já.
Se você já é do UOL, faça seu .
O autor da mensagem, e não o UOL, é o responsável pelo comentário. Reserve um tempo para ler as Regras de Uso para comentários.