;(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
Logo Pagbenk Seu dinheiro rende mais
Topo

Indústria sugere mudança em data de validade de alimentos não perecíveis

A mudança deve ser considerada somente para alimentos que permanecem estáveis em temperatura ambiente, que am por processo de esterilização ou são embalados a vácuo - iStock
A mudança deve ser considerada somente para alimentos que permanecem estáveis em temperatura ambiente, que am por processo de esterilização ou são embalados a vácuo Imagem: iStock

Do UOL, em São Paulo

25/11/2021 17h06Atualizada em 26/11/2021 14h35

A Abia (Associação Brasileira da Indústria de Alimentos) propõe uma nova abordagem em relação ao conceito de data de validade para alimentos não perecíveis, como macarrão, leite e conservas. A ideia da associação é que a data de vencimento continue na embalagem dos alimentos, mas com a sinalização de que o consumo deve ocorrer preferencialmente até aquele dia — o fim do prazo não significa que o alimento não esteja mais adequado e seguro ao consumo.

"No Brasil, se ou da data limite, o alimento não pode mais ser comercializado nem consumido, o que pode fazer com que muita comida, ainda em condições adequadas e seguras para o consumo, vá para o lixo", disse o presidente executivo da ABIA, João Dornellas. Segundo ele, a mudança evitaria o desperdício de alimentos.

A regra proposta é a adoção do "best before", um conceito regulatório que indica o período mínimo em que um produto mantém o sabor e o valor nutricional, caso esteja armazenado conforme as determinações do fabricante e com a embalagem fechada.

A ideia é que, após esse período, o cliente descubra se o produto ainda está adequado ao consumo conferindo, ele mesmo, cheiro, aspecto e gosto.

A proposta foi apresentada no Fórum Nacional da Cadeia de Abastecimento, promovido pela Abras (Associação Brasileira de Supermercados). A Abia diz, porém, que a adoção do "best before" deve estar vinculada a rígidos programas de qualidade, entre eles o controle e boas práticas de fabricação em relação a aspectos microbiológicos.

Segundo a indústria, países que já adotam o conceito não o consideram para produtos que tenham aspectos microbiológicos muito perecíveis, como carnes in natura, leite pasteurizado e queijos frescos. Por isso, a mudança deve ser considerada somente para alimentos que permanecem estáveis em temperatura ambiente, como macarrão, conservas, grãos, sucos de frutas, leite UHT, ou aqueles que am por processo de esterilização ou são embalados a vácuo.

Ou seja, valeria para alimentos não perecíveis ou de baixo risco de contaminação, "desde que atendidas as orientações de armazenamento determinadas pelo fabricante".

Redução do desperdício

De acordo com uma pesquisa da Abras deste ano, produtos com a data de validade vencida são as principais perdas nos supermercados. Os dados mostram que, no varejo, 42,5% do descarte é de não perecíveis e têm como causa a data de validade vencida.

"Apenas em 2020, as perdas de perecíveis e não perecíveis por conta da data de validade expirada representaram R$ 2,18 bilhões", diz a nota da Abia.