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

OPINIÃO

Juca Kfouri: Punição a cantos homofóbicos deveria ser portões fechados

Do UOL, em São Paulo

23/05/2022 16h13

O clássico entre Corinthians e São Paulo ontem (22) foi marcado por mais um episódio de homofobia. Poucos dias depois de ser alvo de racismo na Argentina, torcedores corintianos entoaram cantos homofóbicos contra o time são-paulino, situação que foi relatada na súmula do árbitro Wilton Pereira Sampaio.

No podcast Posse de Bola #230, Juca Kfouri elogia as declarações de Duilio Monteiro Alves, presidente do Corinthians, que repudiou os atos homofóbicos no estádio. O jornalista também ressalta que em casos como o ocorrido no Majestoso, deveria haver a punição de fazer com que o time tenha de jogar com portões fechados.

"Quanto aos gritos homofóbicos eu quero até fazer justiça aqui às declarações do presidente do Corinthians pós-jogo, repudiando os gritos homofóbicos. Eu vou voltar a bater na tecla que significa até uma mudança de opinião que eu tinha durante anos. Eu não acho que o clube deva ser punido com perda de pontos ou com multa por causa de comportamento do torcedor deste tipo, desta gente retrógrada, obscurantista", diz Juca.

"Mas diante de manifestações como essa, a penalidade deve ser fechar os portões do estádio quando o clube tiver mando, o que é uma maneira de multar o clube e que é uma maneira de fazer o torcedor sentir na pele. 'Cantei gritos homofóbicos, racistas, vou ar um tempo sem ir poder ver meu time jogar'. Essa talvez seja a melhor solução", completa.

Ainda que não seja uma punição esportiva, Juca destaca que desta forma há um prejuízo financeiro ao clube e também a privação ao torcedor de ver seu time em ação, podendo levar os próprios torcedores a fiscalizar os demais a fim de evitar a punição.

"Acaba punindo o clube porque não terá a renda, mas quem sabe você estimule assim o comportamento que a gente viu mesmo no domingo, no clássico. O idiota acendeu o luminoso na hora em que o Corinthians estava melhor e que as pessoas no entorno mandaram ele apagar, xingando ele. Quem sabe se fechando portão de estádio o torcedor do lado impeça que o cretino cante o hino homofóbico ou tome uma atitude racista? Me parece que essa é a melhor solução", conclui.

Posse de Bola: Quando e onde ouvir?

A gravação do Posse de Bola está marcada para segundas e sextas-feiras às 9h, sempre com transmissão ao vivo pela home do UOL ou nos perfis do UOL Esporte nas redes sociais (YouTube, Facebook e Twitter).

A partir de meio-dia, o Posse de Bola estará disponível nos principais agregadores de podcasts. Você pode ouvir, por exemplo, no Spotify, Apple Podcasts, Google Podcasts, Amazon Music e Youtube --neste último, também em vídeo. Outros podcasts do UOL estão disponíveis em uol.com.br/podcasts.