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

Marido de Jojo vibra com mudança do trabalho para o RJ: 'Ir morar com a Jo'

Jojo Todynho com o marido, Lucas - Reprodução/Instagram
Jojo Todynho com o marido, Lucas Imagem: Reprodução/Instagram

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

12/04/2022 22h46

A tristeza de Jojo Todynho, de 25 anos, pelo casamento a distância com o militar Lucas Souza, de 21, está perto do fim. Ele anunciou, na noite de hoje, que conseguiu a documentação de transferência do exército do Paraná para o Rio de Janeiro.

"Minha transferência para o Rio de Janeiro foi aprovada e, a principio, no fim do mês já vou estar podendo ir morar com a Jo. Aí, é só alegria agora. Esse final de semana já vou ao Rio de Janeiro fazer alguma coisa", contou Lucas, por meio dos stories, no Instagram.

Ele ainda pediu sugestões de faculdade aos seguidores. Ele cursa istração em Curitiba, no Paraná, e precisará encontrar um novo lugar para estudar.

Jojo Todynho e Lucas Souza estão casados há pouco mais de dois meses. A cantora confessou no último domingo (10), em entrevista ao Blog da Patrícia Kogut, do jornal "O Globo", que era triste manter a relação a distância.

Não é fácil, é muito triste. Mas estamos bem. Estamos na luta esperando essa transferência sair. Está nas mãos de Deus. De qualquer forma, parece até que a gente não mora longe, porque estamos sempre nos falando. É telefone para lá e para cá.
Jojo Todynho

Planos para ser mamãe

Em conversa com os fãs no Instagram, no fim do mês ado, Jojo Todynho abriu o coração e revelou que pretende engravidar ainda neste ano.

"Botei na minha cabeça que no final deste ano eu pretendo engravidar, se Deus assim me permitir", contou.

Ela, inclusive, já imagina o seu próprio comportamento durante a maternidade. "Gente, essa casa é muito grande, tem que ter uma criança aqui. Uma loucura, um choro, corre pra cá, corre pra lá. Acho que isso vai deixar o meu coração um pouquinho mais mole. Vou ser uma mãe chata", itiu.