;(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

Liga dos Campeões 2019/2020

Gabriel Jesus brilha, City elimina o Real e vai às quartas da Champions

Gabriel Jesus comemora gol do Manchester City contra o Real Madrid; brasileiro foi decisivo - Nick Potts / POOL / AFP
Gabriel Jesus comemora gol do Manchester City contra o Real Madrid; brasileiro foi decisivo Imagem: Nick Potts / POOL / AFP

Do UOL, em São Paulo

07/08/2020 17h53

O Manchester City está nas quartas de final da Liga dos Campeões. No retorno da Champions, o time inglês venceu o Real Madrid por 2 a 1, hoje, em casa, no Etihad Stadium, com grande atuação de Gabriel Jesus. O brasileiro deu assistência para Sterling e fez o segundo gol dos donos da casa. Benzema, com assistência de Rodrygo, descontou para os espanhóis.

O City, que já havia vencido a ida pelo mesmo placar, agora enfrentará o Lyon, que bateu a Juventus, no sábado (15), em jogo único nas quartas de final da Champions. Todos os duelos das quartas em diante serão disputados em Portugal.

O jogo começou com o City ligado, enquanto o Real saiu jogando errado em três oportunidades nos primeiros 15 minutos. E a primeira custou um gol. Aos nove minutos, Varane bobeou, Gabriel Jesus roubou a bola na entrada da área e rolou para Sterling completar.

O Real, aos poucos, foi se achando na partida e teve duas boas chances com Benzema e Hazard, que pararam em Ederson. O empate veio aos 28 minutos. Rodrygo fez bela jogada individual e cruzou na medida para Benzema cabecear no canto. O Real ainda voltou a vacilar de novo na defesa, mas o placar não mudou mais até o fim do primeiro tempo.

Benzema - REUTERS/Dave Thompson - REUTERS/Dave Thompson
Benzema empatou para o Real após boa jogada de Rodrygo
Imagem: REUTERS/Dave Thompson

Na volta do intervalo, o City teve a primeira oportunidade da etapa final com Sterling, após e De Bruyne. Courtois fez a defesa. O goleiro do Real ainda evitou gol olímpico de seu compatriota belga pouco depois.

As saídas erradas, que causaram problemas ao Real no primeiro tempo, continuaram. Casemiro perdeu a bola, mas Gundogan errou o e na sequência, e Courtois teve tempo de abafar chute de Sterling. Do outro lado, Zidane trocou Rodrygo por Asensio aos 16 minutos, pouco antes de Benzema bater para defesa firme de Ederson.

Mas logo o City voltou. Após troca de es, Gabriel Jesus girou para cima de Militão e bateu forte. Courtois espalmou. O atacante brasileiro apareceu de novo, desta vez para garantir a classificação do City. Aos 23 minutos, Gabriel Jesus aproveitou mais um vacilo de Varane, que primeiro furou cabeceio, depois tentou recuar de cabeça para Courtois. O camisa 9 do City foi mais rápido e bateu na saída do goleiro do Real.

Sterling - REUTERS/Dave Thompson  - REUTERS/Dave Thompson
Sterling abriu o placar para o City após assistência de Gabriel Jesus
Imagem: REUTERS/Dave Thompson

O gol do brasileiro acabou com qualquer esperança de reação do Real. Precisando de dois gols para conseguir a vaga nas quartas, Zidane colocou Jovic, Valverde e Lucas Vázquez em campo, mas os espanhóis pouco atacaram até o apito final. Os donos da casa controlaram a posse de bola e até tiveram chances de marcar o terceiro. Fim de jogo e City classificado.