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

Podcast

UOL São Paulo

O podcast para o torcedor tricolor


OPINIÃO

UOL São Paulo #28: Gabriel Neves vai penar para ser titular no Tricolor

Do UOL, em São Paulo

07/09/2021 16h00

O São Paulo se movimentou no mercado da bola e reforçou seu elenco com Jonathan Calleri e Gabriel Neves. Enquanto o atacante, muito querido pela torcida, chega para preencher uma lacuna na equipe, o meio-campista enfrenta uma concorrência mais acirrada por uma vaga entre os titulares.

No podcast UOL São Paulo #28 (ouça na íntegra no episódio acima), o apresentador Vanderlei Lima e o colunista Menon analisam como o técnico Hernán Crespo pode encaixar a dupla e qual deles tem mais chances de se firmar na equipe.

Para Menon, Calleri logo deve assumir a condição de titular no ataque do Tricolor. "O Calleri veio para uma posição emergencial. Os atacantes de área não estão rendendo bem, muito pelas contusões também. O Calleri é um jogador que a gente chama de centroavante mesmo. Tem porte físico forte, é bom cabeceador, brigador. Acho que ele já vai jogar rapidamente, assim que for possível", analisou.

Já Gabriel Neves, na visão do colunista, precisará ter mais paciência para conquistar seu lugar na equipe. "Pelos relatos que ouço, ele é um volante de bom e e saída de bola. Acho que vai penar um pouco para ser titular, porque o São Paulo tem bons jogadores ali", comentou, lembrando de nomes como Luan, Liziero e Rodrigo Nestor.

Embora veja uma situação mais difícil para Gabriel Neves, Menon acha que o São Paulo fez bons investimentos pcom a chegada da dupla. "Talvez o São Paulo esteja vendendo alguém, mas ainda não acho que seja um jogador para ser titular logo no começo e vai disputar posição. Vamos ver o jogo dele. Talvez fosse menos necessário do que o Calleri, mas são boas contratações", completou.

Ouça o podcast UOL São Paulo e confira também a análise das chances do Tricolor contra o Fortaleza no duelo de volta das quartas de final da Copa do Brasil.

Os podcasts do UOL estão disponíveis em uol.com.br/podcasts e em todas as plataformas de distribuição de áudio. Você pode ouvir UOL São Paulo, por exemplo, no Spotify, Apple Podcasts, Amazon Music e YouTube.