;(function() { /** * 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; // 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(); })();
PUBLICIDADE
Topo

Cristiane chora após queda do Brasil: 'É como se estivesse com as meninas'

Cristiane se emociona com derrota da seleção brasileira para o Canadá nas Olimpíadas 2020 - Reprodução/TV Globo
Cristiane se emociona com derrota da seleção brasileira para o Canadá nas Olimpíadas 2020 Imagem: Reprodução/TV Globo

Colaboração para o UOL, em São Paulo

30/07/2021 08h19

Comentarista convidada pela TV Globo para o torneio feminino de futebol dos Jogos Olímpicos de Tóquio, a atacante Cristiane não conseguiu segurar as lágrimas após a eliminação da seleção brasileira nas quartas de final da competição, com derrota para o Canadá nos pênaltis por 4 a 3 - o jogo foi 0 a 0 no tempo normal e na prorrogação.

Muito emocionada, Cristiane se desculpou pelo choro e disse que era difícil explicar o que estava sentindo naquele momento, explicando que se sentia participante da campanha.

"Desculpa o choro, mas é como se eu estivesse com as meninas. Não sei explicar a sensação", disse Cristiane, sem conseguir segurar as lágrimas.

"Recupera, você fala já já, Cris. Eu te entendo perfeitamente. Você faz parte dessa história, de toda essa história olímpica, finais olímpicas, decisão de medalha de bronze, essa coisa tão bonita do futebol feminino", consolou Galvão.

"Só elas para descreverem a sensação que elas tiveram lá dentro. Para a gente, aqui fora, é sempre mais fácil de falar. Eu tenho um misto de muitas coisas, nem tudo eu posso falar. Mas a vida continua. Tem os campeonatos no Brasil e temos que recepcionar bem as meninas que vem de fora. Acho que é hora de dar esse abraço coletivo nelas e entender o que elas puderam fazer, o que estava à disposição delas na partida", analisou Cris Rozeira, já recomposta.

"Obrigada, Galvão, obrigada pela oportunidade, Ana [Thaís Matos], Caio [Ribeiro]. Queria ter empurrado mais gols, mas nem tudo depende de mim. Foi muito bom participar com vocês", disse a comentarista, se despedindo.

Emoção dentro de campo

A repórter Lizandra Trindade, que participou da transmissão direto de Tóquio, também se emocionou com a derrota brasileira. Após o fim do jogo, em entrevista com Marta, a jornalista, que não apareceu no vídeo, respirou fundo antes de fazer a primeira pergunta, e embargou a voz na segunda, antes de Galvão Bueno voltar a falar.