;(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();
})();
Sem chances no Brasil, brasileiros encontram espaço nos EUA e, com título, chamam atenção da MLS
Eder TraskiniDo UOL, em Santos (SP)Divulgação
Seis garotos sem espaço no Brasil tentam a sorte no futebol universitário dos Estados Unidos e, contra todas as probabilidades, conquistam um título inédito para sua universidade, já chamando atenção da liga profissional americana, a MLS. A história pode parecer, mas — pelo menos ainda — não é um roteiro de um filme da sua "Sessão da Tarde".
Vitor Dias, Pedro Dolabella, Davi Lima, Vinicius Fernandes, João Peterlini e Gabriel Alves viveram isso. O sexteto comandou o time da Marshall University na temporada que terminou com o título inédito do torneio nacional de futebol masculino da NCAA, a mais importante liga universitária dos EUA, algo totalmente inesperado para uma equipe que nunca tinha sequer chegado nas fases finais da competição.
A maioria deles ou pelas categorias de base de grandes clubes do Brasil, sendo quatro deles ex-São Paulo. No entanto, sem espaço no Tricolor paulista, rodaram por clubes nacionais até parecer quase impossível virar um jogador profissional em terras brasileiras. E foi aí que a oportunidade de traçar uma nova rota na carreira surgiu.
Nos Estados Unidos, a oportunidade é dupla: como bolsistas, jogam pelo time da universidade ao o que também se formam no curso escolhido. Ou seja, mesmo que o futebol "não dê futuro", o diploma está garantido. No entanto, o desempenho por Marshall vem tendo tamanho destaque que a maioria deles já é acompanhada de perto por clubes da MLS, como o LA Galaxy, o Inter Miami e o Atlanta United. Por rotas alternativas, o sonho pode se tornar real.
Divulgação
A gente meio que comanda lá. A gente brinca que é o Shakhtar Donetski do college, lotado de brasileiro. Quase metade dos titulares são brasileiros e o pessoal respeita muito a gente. Comecei a perceber que vários times estão pegando brasileiros. Antes não era comum. Um amigo meu é o único brasileiro da faculdade dele e ouviu do técnico: 'Onde é que Marshall acha tanto brasileiro que joga tão bem assim">window._asyncLoadScript = function asyncLoadScript(src) {
var script = document.createElement('script');
script.type = 'text/javascript';
script.async = true;
script.crossOrigin = 'anonymous';
script.src = src;
document.head.appendChild(script);
return new Promise(function(resolve) {
script.onload = script.onreadystatechange = function() {
if (!script.readyState || script.readyState == 'loaded' || script.readyState == 'complete') {
document.head.removeChild(script);
script.onload = script.onreadystatechange = null;
resolve();
}
}
});
};
;(function (document) {
var generics = [
'//c.jsuol.com.br/assets/?loadComponent=media&contentType=js&tpl=assets/dist/libs/duckslake-sdk.min&cache=202505281839',
'//c.jsuol.com.br/assets/?loadComponent=media&contentType=js&tpl=assets/dist/uol-talker/uol-talker&cache=202505281839',
'//c.jsuol.com.br/assets/?loadComponent=media&contentType=js&tpl=assets/dist/libs/frameworks.min&cache=202505281839',
'//c.jsuol.com.br/assets/?loadComponent=media&contentType=js&tpl=assets/dist/libs/libs.min&cache=202505281839',
'//c.jsuol.com.br/assets/?loadComponent=media&contentType=js&tpl=assets/dist/libs/angular.min&cache=202505281839',
];
// carrega todos os scripts não dependentes um do outro
var promises = generics.map(_asyncLoadScript);
return Promise.all(promises)
.then(function() {
// carrega a expose e os scripts necessários para webpack
return Promise.all([
'//c.jsuol.com.br/assets/?loadComponent=media&contentType=js&tpl=assets/dist/exposejs/expose.min&cache=202505281839', '//c.jsuol.com.br/assets/?loadComponent=assets&contentType=js&tpl=vendors.js,runtime.js,main.js&hash=e023fa58124d35fd090e750cdd2169ed250a77cda4d95bf5c21f9969cf33&origin=vendors-js', ].map(_asyncLoadScript));
})
.then(function() {
// Executa o UOLoader e carrega os scripts que dependen da expose
// Como são ações que não dependem de si, rodam em paralelo
return Promise.all([
UOLoader([{"id":"special-thematic","path":"projects/specials-default/special-thematic"},{"id":"svg-icons","path":"structure/bootstrap/svg-icons"},{"id":"news-notice","path":"basics/news-notice"},{"id":"header-menu","path":"basics/header-menu"},{"id":"widget-profile","path":"basics/widget-profile"},{"id":"back-to-top","path":"basics/back-to-top"},{"id":"header","path":"basics/header"},{"id":"special-cover","path":"projects/specials-default/special-cover"},{"id":"special-list","path":"projects/specials-default/special-list"},{"id":"special-nav","path":"projects/specials-default/special-nav"},{"id":"feed-redirect","path":"projects/feed/feed-redirect"},{"id":"modal-content-ticker","path":"basics/modal-content-ticker"},{"id":"special","path":"projects/specials-default/special"},{"id":"","path":"basics/"},{"id":"scroll","path":"structure/bootstrap/scroll"},{"id":"piano","path":"basics/piano"},{"id":"google-one-tap","path":"structure/google-one-tap"}]),
...[
'//c.jsuol.com.br/assets/?loadComponent=media&contentType=js&tpl=alert,forms,photo,read-more,modal,babel,babel-,contauol-,babel-service,suggest,share,ads&cache=202505281839',
].map(_asyncLoadScript),
]);
})
.then(function() {
// roda o primeiro render
render();
// dispara evento que indica que o primeiro UOLoader foi completo
window.gevent.emit('firstLoaderDone');
});
})(document);