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

PSG e Real Madrid... quem já pode ser campeão nesta semana nos europeus

PSG pode conquista o Campeonato Francês nesta quarta-feira - REUTERS/Stephane Mahe
PSG pode conquista o Campeonato Francês nesta quarta-feira Imagem: REUTERS/Stephane Mahe

Do UOL, em São Paulo

19/04/2022 04h00

A temporada europeia está em seus minutos finais, e alguns clubes já iniciaram a contagem regressiva para soltar o grito de campeão. Lionel Messi está próximo de levantar seu primeiro troféu pelo Paris Saint-Germain. Já o Real Madrid contou com um tropeço do Barcelona, ontem, para colocar uma mão no título do Campeonato Espanhol.

Ao todo, três dos principais campeonatos europeus podem coroar seus campeões nesta semana. E o UOL Esporte listou o que PSG, Real Madrid e Bayern de Munique precisam fazer na próxima rodada para levar o troféu para casa. Confira!

Campeonato Francês

PSG - REUTERS/Stephane Mahe - REUTERS/Stephane Mahe
Imagem: REUTERS/Stephane Mahe

O PSG de Messi, Neymar e Mbappé pode ser campeão francês já nesta quarta-feira. Após ver o Lille ficar com a taça na última temporada, o time parisiense está próximo de retomar a hegemonia no futebol nacional e chegar ao oitavo título em 10 anos.

A equipe de Mauricio Pochettino lidera a competição com 74 pontos e precisa de uma vitória contra o Angers, quarta-feira, às 16h (de Brasília) —somada a derrota ou empate do Olympique de Marselha contra o Nantes, que joga no mesmo dia e horário— para ser campeã. Um tropeço do PSG ou um triunfo do vice-líder Olympique (que tem 59 pontos) adia a festa parisiense para a próxima rodada.

Campeonato Espanhol

Real Madrid - Rafa Babot/Getty Images - Rafa Babot/Getty Images
Imagem: Rafa Babot/Getty Images

Já o Real Madrid pode comemorar seu 35º título do Campeonato Espanhol do sofá de casa. Líder de La Liga com 75 pontos, o time merengue contou com um tropeço do Barcelona, ontem, para abrir 15 pontos em relação ao vice-líder blaugrana.

Dessa forma, o Real precisa de uma vitória contra o Osasuna, quarta-feira, às 16h30 (de Brasília) para ter chances de ser campeão ainda esta semana. O time da capital espanhola, porém, precisará esperar o jogo entre Barcelona e Real Sociedad, na quinta-feira, no mesmo horário, para comemorar, ou não, o título. Isso porque um triunfo catalão fora de casa adia o título merengue.

Campeonato Alemão

Bayern - Alexander Hassenstein/Getty Images - Alexander Hassenstein/Getty Images
Imagem: Alexander Hassenstein/Getty Images

O Bayern de Munique tem a chance de definir o Campeonato Alemão neste sábado, às 13h30 (de Brasília), em confronto direto com o vice Borussia Dortmund, na Allianz Arena.

O clube da Baviera lidera a competição com 72 pontos, nove a mais em relação ao Dortmund, e se sagra campeão em caso de vitória no clássico. O empate ou um revés do Bayern deixam a disputa em aberto.