;(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 - 2022/2023

City e Dortmund empatam e avançam na Champions em noite apagada de Haaland

Haaland disputa lance com Mats Hummels, na partida entre Borussia Dortmund e Manchester City - Matthias Hangst/Getty Images
Haaland disputa lance com Mats Hummels, na partida entre Borussia Dortmund e Manchester City Imagem: Matthias Hangst/Getty Images

do UOL, em São Paulo (SP)

25/10/2022 17h51

Na volta de Haaland ao Signal Iduna Park, o norueguês até tentou, mas esbarrou em boa partida da linha de defesa do Borussia Dortmund, em especial do capitão Hummels e do goleiro Kobel, que tiveram a missão de evitar uma nova lei do ex em solo alemão. Resultado: 0 a 0, com a equipe da casa sendo mais perigosa que os Citizens na maior parte dos dois tempos. Apesar da melhora dos ingleses na segunda etapa, não foi o suficiente para vencer os alemães, apoiados por 80 mil torcedores, além da tradicional Muralha Amarela.

Com o resultado, o cenário não mudou muito pro City, que manteve a primeira colocação e a vaga assegurada o mata-mata. Já o resultado garantiu o Borussia na próxima fase da Liga dos Campeões, já que no duelo direto contra o Sevilla, primeiro critério de desempate, o Dortmund tem uma vitória e um empate. A última rodada do grupo G será apenas para cumprir tabela.

Melhor do jogo - Kobel

Possível adversário do Brasil na Copa do Mundo com a lesão do titular Yann Sommer, o goleiro suíço garantiu o resultado e a classificação dos Dortmund ao defender a cobrança de penalidade de Mahrez, aos 13 da segunda etapa. Ainda trabalhou bem ao parar Álvarez e Foden também na etapa complementar.

Pior do jogo - Mahrez

Após pênalti sofrido por ele mesmo, o argelino perdeu seu segundo pênalti na Liga dos Campeões (já havia desperdiçado cobrança diante do Copenhagem, em duelo que acabou 0 a 0). Quatro pontos deixados no caminho pelo camisa 26 na fase de grupos.

Jogo do Dortmund

O técnico Edin Terzic apostou nas transições rápidas, contando com a velocidade da dupla Moukoko e Adeyemi, que deu bastante trabalho para o trio de zaga dos Citizens na primeira etapa. Só faltou caprichar mais nas finalizações ao gol de Ortega, substituto do brasileiro Ederson.

Jogo do Manchester City

O City fez seu jogo ao estilo Guardiola, com superioridade na posse de bola e paciência para tentar encontrar os espaços. A formação inicial indicou uma formação com três zagueiros e dois meio campistas. Mas o time misto não demonstrou muito entrosamento, e, se sobrou posse de bola, faltou efetividade. Mesmo com a melhora na segunda etapa, não foi o suficiente para vencer o goleiro Kobel.

Arbitragem

A equipe italiana de arbitragem comandada por Davide Massa teve apenas uma grande decisão equivocada, ao não marcar bola na mão do zagueiro Schlotterbeck, que seria falta perigosa na entrada da área a favor do City aos 40 da primeira etapa. O pênalti assinalado de Enre Can em Mahrez nem sequer foi reclamado pelos jogadores do clube alemão. No geral, arbitragem regular em Dortmund.

Momento decisivo

O pênalti de Enre Can em Mahrez aos 10 minutos da etapa complementar parecia definir o resto do jogo, mas o goleiro Kobel acertou o canto e manteve o placar em 0 a 0.