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

São Paulo

Polivalente e artilheiro da Copinha: conheça William, reforço do São Paulo

[email protected] (Redação)

17/03/2021 08h00

O São Paulo acertou a contratação do meia William, que atuava pelo Toluca, do México. O jogador de 34 anos é esperado na sexta-feira para a realização de exames médicos e até o fim da temporada.

William chega ao São Paulo para ser uma opção com características diferentes dos meio-campistas à disposição do técnico Hernán Crespo. Apesar da idade já avançada, é um jogador de boa imposição física e que ocupa uma grande faixa do campo, podendo ser utilizado em diferentes funções.

Pelo Toluca, William foi normalmente escalado como segundo volante, sendo uma peça com muita liberdade para chegar a área. Não é um organizador de jogo, sendo o responsável por distribuir a bola de trás e verticalizar os es, como o Daniel Alves. Como Crespo gosta de marcar o adversário no campo de ataque, o jogador de 34 anos pode ser importante para pressionar e recuperar bolas em um local vantajoso.

Em circunstâncias específicas, William também foi utilizado como lateral-esquerdo, valendo-se de sua imposição física para fechar a linha de quatro. Além disso, chegou a ser primeiro volante quando o Toluca atuou em uma formação com três zagueiros, esquema que vem sendo implementado por Crespo no São Paulo.

Revelado pela categoria de base do Palmeiras, William foi artilheiro da Copa São Paulo de Futebol Júnior. Na ocasião, o jogador balançou as redes sete vezes em sete partidas disputadas. Foi a única vez que o rival alviverde teve um jogador na liderança do ranking de artilharia da competição.

William está desde 2013 no futebol mexicano, tendo ado pelo Querétero, América e, por fim, Toluca. Ao todo, foram 209 partidas disputadas desde que desembarcou no país, com 26 gols marcados. Sua identificação com o México foi tamanha que optou pela naturalização, caso a seleção nacional quisesse chamá-lo, o que acabou não acontecendo.

Muricy Ramalho, que hoje é coordenador técnico do São Paulo, chegou a treinar William no Palmeiras. Em 2010, o jogador voltou de uma série de empréstimos e foi aproveitado pelo clube palestrino no início da temporada.

São Paulo