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

Alicia Klein

OPINIÃO

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

Flamengo, Vasco e tantas outras brigas: torcidas que traumatizam torcedores

Briga de torcidas antes de Flamengo e Vasco jogarem no Maracanã - Reprodução/Twitter
Briga de torcidas antes de Flamengo e Vasco jogarem no Maracanã Imagem: Reprodução/Twitter

Receba os novos posts desta coluna no seu e-mail

Email inválido

Mesmo antes de Flamengo x Vasco, na manhã de ontem, a confusão já se espalhava por todo o Rio de Janeiro. Brigas pulularam em vários bairros da cidade, amedrontando os verdadeiros torcedores, que tentavam aproveitar o clássico.

No placar do estádio, 1 a 0 para o Cruzmaltino. Depois de três derrotas seguidas para o maior rival, o Vasco finalmente saiu vitorioso. Resultado importantíssimo para quem a por grande reformulação e mais uma decepção para a coleção de Vítor Pereira — que parece viver uma outra realidade, a julgar por suas coletivas pós-jogo.

O pior resultado, porém, ficou mesmo do lado de fora. Noventa pedaços de madeira apreendidos, nove canos, pedras, bombas caseiras, socos ingleses, embate com a polícia, viatura depredada, cavalaria, dezenas de pessoas feridas, oito com entrada no Hospital Municipal Souza Aguiar, duas em estado grave.

Uma jornalista do interior do estado contou à CBN que tinha ido com a família pela primeira vez ao Maracanã. Ela e a filha de 8 anos ficaram encurraladas do lado de fora, em pânico, aos prantos.

Resultado: "Nunca mais eu volto".

Como mãe, não consigo imaginar o desespero de colocar meu filho em risco. "Vamos ver o time da mamãe jogar? Mas, olha, talvez a gente apanhe. Talvez a gente morra." É inconcebível.

Torcedoras e torcedores de verdade sendo afastados desde a infância. Sofrendo desde cedo. Traumatizados pela experiência que deveria ser de conexão, de emoção, de euforia. Mas que se torna inesquecível pelos piores motivos.

Amo futebol. Amo dia de clássico, qualquer clássico. Já fui a muitos. Adoraria compartilhar esse amor com meu filho. Mas também já corri de muita briga em porta de estádio. Já evitei certas estações de metrô, já combinei com amigos o melhor jeito de escapar da rota da porradaria. Assisti pela televisão, ao vivo, uma das cenas mais assustadoras do esporte, a final da Supercopa de Juniores, em 1995, no Pacaembu.

Como conciliar tanto amor e tanto ódio? Como levar o amor adiante vendo a violência se perpetuar com a camisa dos times que amamos? Como escolher colocar em risco as pessoas que mais amamos, por causa de futebol?

Siga Alicia Klein no Instagram e no Twitter

Leia todas as colunas da Alicia aqui

Errata: este conteúdo foi atualizado
Diferentemente do informado no texto, o Vasco vinha de três derrotas seguidas, e não nove como dito antes. Em 15 de abril de 2021, o Vasco venceu por 3x1 o Flamengo. O erro já foi corrigido.

** Este texto não reflete, necessariamente, a opinião do UOL