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

Represento um país que possivelmente nem me aceita, diz meia de Juve e EUA

Weston McKennie, meia da Juventus, critica racismo nos EUA - Divulgação
Weston McKennie, meia da Juventus, critica racismo nos EUA Imagem: Divulgação

Colaboração para o UOL, em São Paulo

13/10/2020 12h07

Meia da Juventus e da seleção dos EUA, Weston McKennie acredita representar um país que "possivelmente nem me aceita só pela cor da minha pele". Em campanha da Adidas, o jogador recordou um episódio em que foi vítima de racismo e afirmou que também quer ser "grande" fora das quatro linhas.

McKennie ainda itiu ter medo de sair à noite quando está em Dallas (EUA) e citou o protesto feito em campo por "justiça para George Floyd". Atleta Schalke 04 na época, ele entrou em campo com uma braçadeira em homenagem ao afro-americano morto por um policial em maio.

"Neste ano, no início da temporada, jogamos e os torcedores, após o jogo, fizeram sons de macaco para mim. É devastador. Eu voltei para a minha casa em Dallas e tenho medo de dirigir à noite, só porque não sei o que acontecerá se eu for parado. Eu represento um país que possivelmente nem me aceita só pela cor da minha pele. É definitivamente doloroso", disse o jogador.

"Quando usei a braçadeira, senti que era um dever e uma responsabilidade, sendo norte-americano, e sendo um norte-americano negro. Eu apenas senti a necessidade de trazer consciência para o exterior. Eu recebi muito apoio por isso, e ódio também. 'Você é um jogador de futebol, não deveria fazer declarações políticas'. Não vejo isso como um posicionamento político, uma pessoa perdeu a vida. Não vou calar a bola e driblar", seguiu McKennie.

"Não diminuirei a minha opinião só porque as pessoas acreditam que eu deveria apenas jogar futebol. Não quero ser apenas conhecido como um grande jogador, mas como um grande ser humano, uma grande pessoa. E é isso que estou começando a tentar fazer: criar o meu legado. Esta é a versão de mim que eu amo", concluiu.