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

Salão do automóvel de São Paulo é adiado, e motivo não é o coronavírus

Salão do Automóvel de São Paulo 2018 - Divulgação
Salão do Automóvel de São Paulo 2018 Imagem: Divulgação

Cleide Silva

06/03/2020 07h39

Depois de Pequim (China) e Genebra (Suíça) cancelarem a realização dos respectivos salões de automóvel deste ano, agora é o Brasil que decide adiar o evento que ocorreria em São Paulo de 12 a 22 de novembro.

No caso brasileiro, o motivo não é a epidemia do coronavírus, mas o alto investimento que as empresas precisam desembolsar em locação e montagem de estandes, além de contratação de pessoal. Segundo fontes do mercado, os custos podem variar de R$ 1 milhão a R$ 20 milhões, dependendo do tamanho da área e da infraestrutura utilizada.

A suspensão do evento que ocorre a cada dois anos desde 1960 será anunciada hoje pela Associação Nacional dos Fabricantes de Veículos Automotores (Anfavea). A nova data está prevista para 2021, mas não se sabe ainda quando pois há um calendário oficial de salões coordenado pela entidade internacional do setor, a Oica.

Nos bastidores, há quem diga que a alta do dólar também tem sua parcela de culpa. Desde o início do ano, 15 marcas, entre as quais General Motors, Toyota e Hyundai já haviam anunciado que não participariam.

A Volkswagen dizia que só estaria presente se houvesse mudanças no formato da feira, com estandes menores, mais tecnologia e possibilidade de vendas de produtos, como ocorre com a Fenatran, a feira de caminhões.

Limite de gasto

"O custo do evento sempre foi alto, mas quando a situação das empresas estava boa, ninguém reclamava", diz o executivo de uma grande montadora. "Agora, como estão no prejuízo e ainda tem esse câmbio desastroso, chegou-se ao ponto de ter de cancelar o salão."

Ainda não há definições sobre data, local e tamanho do evento para 2021, mas certamente será menor. Há, inclusive, uma proposta de limite de gastos para cada estande, para evitar distorções. "Como há muita concorrência, se uma marca faz algo grandioso a outra não quer ficar atrás", diz o executivo.

Também há reivindicação de que o custo da locação cobrado pela Reed Exhibitions, promotora do evento, seja reduzido em 50%. Há ainda quem defenda a mudança do local, hoje no São Paulo Expo, que é espaçoso mas de difícil o.

As informações são do jornal "O Estado de S. Paulo".