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

Fluminense

Fluminense anuncia a contratação do volante Felipe Melo, ex-Palmeiras

Do UOL, no Rio de Janeiro (RJ)

13/12/2021 14h24

O Fluminense anunciou, na tarde de hoje (13), a contratação do volante Felipe Melo. O jogador, de 38 anos, assinou contrato com o clube até dezembro de 2023.

Nas Laranjeiras, ele vestirá a camisa 52, em homenagem ao aniversário da conquista da Copa Rio de 1952, que completa 70 anos no ano que vem.

"Eu sou um cara que sou leal a quem é leal comigo, a quem me dá oportunidade. Então a minha lealdade é total ao Fluminense, um clube que me abriu as portas e isso para mim não tem preço. Poder chegar a um clube de tamanha grandeza como é o Fluminense e gerar expectativa é muito importante, motivo de muito orgulho. O que eu posso falar para o torcedor do Fluminense é que jamais vai faltar empenho e vontade. Hoje o Fluminense é a minha casa e vou fazer, sem dúvida nenhuma, com que a camisa do Fluminense seja minha segunda pele. É o mínimo que eu posso fazer por um clube tão grandioso que me abriu as portas neste momento", disse, ao site oficial.

Felipe Melo assina com o Fluminense depois de agem pelo Palmeiras, onde desembarcou em 2017 e conquistou alguns títulos importantes, como o bi da Libertadores em 2020 e 2021 e o Brasileiro de 2018.

"Eu espero seguir nessa caminhada, nessa sequência de levantar troféus. Porque eu tenho ainda mais uma responsabilidade, que é poder honrar os meus pais, que são tricolores. Quero conquistar títulos aqui, como prometi para eles. Eu chego aqui para brigar pelo Campeonato Brasileiro, Campeonato Carioca, Copa do Brasil, Libertadores... Porque o Fluminense é gigante e todo clube gigante o mínimo que tem que fazer é brigar por esses títulos", afirmou.

Felipe Melo assina seu contrato até dezembro de 2023 ao lado do presidente do Flu, Mário Bittencourt - Mailson Santana / Fluminense - Mailson Santana / Fluminense
Felipe Melo assina seu contrato até dezembro de 2023 ao lado do presidente do Flu, Mário Bittencourt
Imagem: Mailson Santana / Fluminense

Mário Bittencourt, presidente do Tricolor, celebrou a contratação, salientando o perfil do volante.

"A chegada do Felipe Melo é muito importante para nós. Trata-se de um grande jogador, de perfil vencedor e com um currículo que fala por si. Ele faz parte do nosso projeto de montar um grande time, que vai em busca de objetivos importantes. Tenho certeza de que ele vai nos ajudar muito", disse o presidente.

As movimentações do Fluminense não deverão parar por aí. O clube tem negociações avançadas para adquirir por empréstimo o lateral esquerdo Mário Pineida, do Barcelona de Guayaquil (EQU), e também negocia com os atacantes Ricardo Goulart — que está sem clube — e Germán Cano, que não renovará com o Vasco.

Fluminense