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

Danilo Lavieri

OPINIÃO

Texto em que o autor apresenta e defende suas ideias e opiniões, a partir da interpretação de fatos e dados.

Corinthians e Flamengo são responsáveis por violência contra seus jogadores

Integrantes de organizadas do Flamengo fazem protesto na porta do CT Ninho do Urubu - Reprodução S1 Live / Twitter Isabelle Costa
Integrantes de organizadas do Flamengo fazem protesto na porta do CT Ninho do Urubu Imagem: Reprodução S1 Live / Twitter Isabelle Costa

Colunista do UOL

08/04/2022 11h39

Receba os novos posts desta coluna no seu e-mail

Email inválido

Os clubes de futebol têm total responsabilidade pelos protestos violentos que torcedores fazem contra seus jogadores. Episódios como os vistos no Corinthians no Flamengo entre ontem e hoje (8) só acontecem porque há uma conivência das diretorias com comportamento como presenciamos nos últimos dias.

No Parque São Jorge, por exemplo, Cássio e sua família precisaram ir à delegacia para registrar B.O. por uma ameaça com direito até a foto com arma de fogo. O detalhe é que minutos antes de o episódio atingir um dos principais ídolos do clube, alguns membros de organizadas que tinham acabado de dizer em nota oficial que "ou joga por amor ou por terror" tinham a sua entrada permitida no CT Joaquim Grava, como flagrou a câmera da ESPN. Do que adianta soltar uma nota de repúdio e permitir esse tipo de coisa?

Afinal, por que esses torcedores têm direito de entrar para conversar com diretoria, comissão técnica ou jogadores? Por que as relações institucionais são mantidas mesmo após episódios como esse? Por que eles ainda recebem benefícios em viagens ou ingressos diretamente do clube? Vale lembrar que em 2014 uma invasão neste mesmo CT colocou em risco a segurança dos atletas e, naquela ocasião, as câmeras estavam misteriosamente desligadas.

Nos episódios de hoje no Flamengo, torcedores cercaram os carros dos atletas, ameaçaram alguns atletas e até mesmo tentaram a agressão pela janela em alguns casos. E vale lembrar que, até o início da semana, Marcos Braz estava marcando reunião com as organizadas para ouvir as reivindicações dos torcedores. Por que eles têm esse direito e um sócio-torcedor que paga todo mês a mensalidade não tem?

Em um ado recente, episódios de violência como esses foram vistos no Palmeiras, no São Paulo, no Grêmio... A lista é infinita. Quando um clube presencia cenas como essa e não faz nada, a impressão que fica é que ele está gostando desse tipo de pressão e concordando com cobranças desse tipo.

Protestos são válidos. Torcedores têm que reclamar quando não estão satisfeitos com o que está rolando em campo, mas tudo dentro do limite. Um rompimento institucional entre clube e torcida não garante que a violência vai parar, mas ao menos mostra que as diretorias não são coniventes com atos como esse.

Enquanto clubes e, principalmente, jogadores não se unirem para que esse tipo de coisa não aconteça mais, continuaremos a ver episódios como esse se repetindo. Não adianta se incomodar apenas quando acontece com o seu time.

Siga também as opiniões de Danilo Lavieri no Twitter, no Instagram e no TikTok

  • Acompanhe os destaques do esporte na Live do Danilo e do Vitão: