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

Esse conteúdo é antigo

Calor do Canadá cozinhou mariscos, mexilhões e moluscos vivos a céu aberto

Animais marinhos sofrem com calor intenso no Canadá - Christopher Harley/University of British Columbia.
Animais marinhos sofrem com calor intenso no Canadá Imagem: Christopher Harley/University of British Columbia.

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

13/07/2021 17h39Atualizada em 13/07/2021 17h39

A onda de calor enfrentada pelo Canadá na semana ada cozinhou moluscos, mexilhões e mariscos a céu aberto, além de matar cerca de 1 bilhão de animais marinhos, segundo pesquisadores da Universidade da Colúmbia Britânica, área do país mais castigada pelas temperaturas extremas.

Fotos registradas pelo professor Christopher Harley, do departamento de zoologia da instituição de ensino, mostraram centenas dos animais cozidos e podres à beira da praia. Levando em conta a estimativa de letalidade por metro quadrado, segundo o acadêmico, a perspectiva é de que uma grande população desse ecossistema não tenha resistido ao calor.

"Pude sentir o cheiro daquela praia antes de chegar, porque já havia muitos animais mortos do dia anterior, que não foi o mais quente entre os três com temperatura mais alta", detalhou o professor em entrevista à CNN americana.

"Foi uma catástrofe. Há uma população de mexilhões realmente extensa que cobre a costa e a maioria desses animais tinha morrido", completou o professor, que também visitou outra praia, em Vancouver, acompanhado de seus alunos.

Segundo um cálculo feito por ele em nome da universidade, no Mar de Salish, que inclui o Estreito da Geórgia, de Puget e Juan de Fuca, a estimativa é de que a morte de 1 bilhão de animais é "muito preliminar", mas pode ser real.

O professor explica que na palma da mão de um homem adulto cabem de 50 a 100 mexilhões e que, portanto, milhares deles cabem em apenas um metro quadrado.

"Há 4.000 quilômetros de costa no Mar Salish, então quando você começa a relacionar o que estamos vendo localmente para o que esperamos em escala maior, com base no que sabemos sobre onde os mexilhões vivem, você chega a alguns números muito grandes muito rapidamente", conta Harley.

Os danos recentes podem ser ainda piores em um prazo de 10 anos, de acordo com o especialista. "Se continuarmos a ter ondas de calor como esta, o ecossistema ficará muito, muito diferente", conclui.