;(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(); })();
  • AssineUOL
Topo

A última Copa de Messi e CR7

As principais histórias do último mundial dos melhores jogadores do século

Mais um pouco de combustível, e Cristiano Ronaldo brilhava novamente

Cristiano Ronaldo não marcou, mas foi, como de costume, o centro das atenções - Martin Rickett - PA Images/PA Images via Getty Images
Cristiano Ronaldo não marcou, mas foi, como de costume, o centro das atenções Imagem: Martin Rickett - PA Images/PA Images via Getty Images
e Bruno Andrade

Colunista do UOL, em Doha (Qatar)

28/11/2022 18h10

Classificação e Jogos

Poucos segundos antes de a bola rolar para Portugal e Uruguai, Cristiano Ronaldo correu para o banco de reservas. Pediu uma garrafa de água. Foi rapidamente atendido. Hidratação mais do que necessária. Mas não se refrescou em paz. Dezenas de fotógrafos ainda estavam em campo.

Entre um clique e outro, um flash aqui e outro ali e muito, muito empurra-empurra, o camisa 7 português fez o que sabe fazer de melhor: chamar atenção. Deu duas ou três goladas cinematográficas. Pronto então para começar a partida no Lusail Stadium com o tanque completo.

O craque com a famosa aversão à bebida alcoólica e até mesmo Coca-Cola foi bastante acionado pelos companheiros nos primeiros 45 minutos. A barriga estava cheia, mas a sede para balançar a rede continuava insaciável. Como de costume.

Quase não levou perigo no início. Teve como lance mais caloroso uma plástica assistência de peito para William Carvalho, logo aos três minutos. O remate do volante acabou por ar longe. Depois, gastou boa parte da energia com alguns piques e tentativas de dribles.

O intervalo calhou na hora certa. Precisava mesmo repor o combustível. Desta vez, sem a presença de milhares de câmeras. Longe dos holofotes. Sossegado. Voltou para o segundo tempo com o fôlego de sempre. Ávido por uma oportunidade para molhar o bico.

Aos oito minutos, acompanhou atentamente o cruzamento de Bruno Fernandes, com quem "até ontem" dividia a geladeira no vestiário do Manchester United. Pulou o mais alto que podia. Faltou potência. Por muito pouco não desviou a bola, que, delicadamente, ou e morreu dentro do gol.

Correu para comemorar como se tivesse sido ele a marcar. Porém, o próprio tinha dúvidas. Ao abraçar João Félix, disse, entre outras palavras, "não sei, mano!". A Fifa rapidamente encerrou a discussão: o responsável pela "confusão" na inauguração do placar havia sido o camisa 8.

Aos 47 minutos, também do pé direito de Bruno surgiu o segundo - e decisivo - tento. Logo de pênalti, uma das suas maiores especialidades. No entanto, já não estava mais em campo. Desgastado e "na reserva", tinha saído momentos antes para dar lugar a Gonçalo Ramos.

Talvez, sei lá, não reabasteceu como deveria na estratégica pausa de um tempo para o outro. Pouco importou, sinceramente. Saiu na foto em grande. Saiu ainda maior do confronto. Com uma vitória por 2 a 0 e a classificação às oitavas de final da Copa do Mundo do Qatar.