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

Desde eleição de 2018, dobra número de viradas em disputas de governadores

Tucanos, Raquel Lyra e Eduardo Leite foram os governadores eleitos que viraram e mais aumentaram diferença com adversário - Divulgação
Tucanos, Raquel Lyra e Eduardo Leite foram os governadores eleitos que viraram e mais aumentaram diferença com adversário Imagem: Divulgação

Matheus Mattos

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

30/10/2022 21h09Atualizada em 31/10/2022 00h51

As eleições de 2022 tiveram quatro viradas na disputa estadual, com governadores eleitos após terem saído atrás no primeiro turno.

Das 12 disputas governamentais em segundo turno, quatro estados registraram virada. São cerca de 34%, porcentagem superior à taxa histórica, que é de pouco mais de 28%.

Desde 1990, foram 108 disputas em dois turnos para decidir o governador e apenas 31 vitórias com viradas.

O último ano de eleições governamentais, 2018, registrou o menor número de viradas, apenas duas em 14 disputas de segundo turno. Em 1998 e 2014, houve maior porcentagem de viradas, ambas superiores a 35%.

Quem virou?

  • Eduardo Riedel (PSDB-MS)
  • Raquel Lyra (PSDB-PE)
  • Eduardo Leite (PSDB-RS)
  • Fábio Mitidieri (PSD-SE)

As viradas mais expressivas foram de dois tucanos: Raquel Lyra, em Pernambuco, e Eduardo Leite, no Rio Grande do Sul. Leite reverteu um cenário que ultraava os dez pontos percentuais de diferença no primeiro turno. Já Raquel ultraou Marília Arraes por uma margem grande: de 3,39% a favor de Marília para 17,38 a favor da tucana.

Sergipe foi o estado que registrou a virada mais apertada, apenas 3,4% de diferença favorável a Fábio Mitidieri, do PSD.

Veja a diferença percentual para o adversário no segundo turno

  • Raquel Lyra (PSDB) - 17,38% contra Marília Arraes (SD)
  • Eduardo Leite (PSDB) - 14,22% contra Onyx Lorenzoni (PL)
  • Eduardo Riedel (PSDB) - 13% contra Capitão Contar (PRTB)
  • Fábio Mitidieri (PSD) - 3,4% contra Rogério Carvalho (PT)