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

Mundial de Clubes - 2020

Tigres vence Ulsan por 2 a 1 e enfrentará Palmeiras na semifinal do Mundial

Partida entre Tigres x Ulsan Hyundai pela vaga na semifinal do Mundial de Clubes da Fifa - MOHAMMED DABBOUS/REUTERS
Partida entre Tigres x Ulsan Hyundai pela vaga na semifinal do Mundial de Clubes da Fifa Imagem: MOHAMMED DABBOUS/REUTERS

Do UOL, em São Paulo

04/02/2021 12h58Atualizada em 04/02/2021 15h53

O Tigres venceu o Ulsan por 2 a 1 no Al Rayyan Stadium nesta quinta-feira (4), em Doha, no Qatar, pela primeira partida do Mundial de Clubes, com boa atuação do atacante francês Gignac. O resultado de hoje credenciou o time mexicano como adversário do Palmeiras na semifinal do torneio, que acontece no próximo domingo (7).

A partida contou com a presença de torcedores locais, todos com teste de covid-19 negativo, segundo a Fifa. Nos primeiros quatro minutos de jogo, os atletas reclamaram algumas vezes da bola, que precisou ser substituída.

O Ulsan abriu o placar com um gol de bola parada de Kim Kee-hee, aos 24 minutos de jogo, mas não conseguiu segurar a vantagem no marcador. O Tigres empatou aos 38 minutos, graças ao experiente francês André-Pierre Gignac, membro da seleção de seu país na Euro de 2016.

Aos dois minutos de acréscimo do primeiro tempo, houve um pênalti de Kee-Hee a favor do Tigres. Gignac cobrou e garantiu a virada dos mexicanos na primeira etapa da partida.

O segundo tempo teve o início dominado pelo Ulsan, que pressionou o Tigres com muita marcação. Aos 13 minutos, Yoon Bit-garam marcou um belo gol, que acabou anulado em razão de impedimento. No restante do duelo, os dois times focaram nas finalizações, mas nenhuma foi parar no fundo da rede.

Palmeiras e Tigres se enfrentam no próximo domingo (7), às 15h (de Brasília), com transmissão da Rede Globo. O Bayern de Munique, outro semifinalista do torneio, encara o vencedor de Al Duhail e Al-Ahly na segunda-feira (8).

Os vencedores desses dois jogos semifinais vão disputar a final do Mundial de Clubes da Fifa na próxima quinta-feira (11), às 15h (de Brasília).

Análise dos blogueiros do UOL: