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

Por que este fone da JBL faz tanto sucesso? Veja o que diz quem comprou

Fone de ouvido da JBL é simples, mas apresenta qualidade na reprodução de sons, segundo seus compradores - Arte UOL
Fone de ouvido da JBL é simples, mas apresenta qualidade na reprodução de sons, segundo seus compradores Imagem: Arte UOL

Rodrigo Lara

Colaboração para Tilt

31/05/2023 04h00Atualizada em 01/06/2023 11h52

Está atrás de um fone simples, mas não dispensa qualidade? Então esta opção pode ser bem interessante: o JBL C50HI.

Trata-se de um modelo intra-auricular —ou seja, que encaixa na entrada do ouvido— com fio, feito para ser ligado em aparelhos que tenham entrada de 3,5 mm do tipo P3. Isso significa que, além de ouvir sons, o fone também conta com microfone.

O modelo traz ponteiras de tamanhos distintos, o que facilita na hora de encontrar um bom encaixe.

Ele tem controle no cabo para reprodução de músicas e de chamadas. E, para evitar o emaranhado de fios, o cabo dele —que tem 1,2 metro— é achatado. A marca ainda destaca a capacidade do modelo de reproduzir sons graves.

O JBL C50HI tem feito sucesso na Amazon, onde tem mais de 49.000 avaliações de clientes, média de 4,6 e 77% de notas máximas (5). Lá, ele é vendido por um preço bem convidativo: R$ 49,99.

Fone de ouvido C50HI - JBL

Fone de ouvido C50HI - JBL

PREÇO: de R$ 54,99 por R$ 49,99 (9% de desconto)

O que diz quem comprou

Eles são anatômicos e muito leves. A inclinação da ponteira em relação aos alto-falantes, típica desses modelos da JBL, permite um ajuste perfeito a ponto de você nem sentir que está com eles. Finalmente, o microfone é bastante sensível, e nos testes que fiz (celular e PC) produziu gravações com ótima qualidade para um equipamento deste tipo. Por tudo isso, considerando preço, prós e contras, creio que é uma boa compra. [...] Claramente o fabricante assumiu, para baixar o preço, um compromisso com a qualidade do som, e não tanto com uma estrutura ou materiais mais resistentes. É um produto um pouco frágil.

Por Alexander Cornwell