A Ray-Ban é referência no mercado óptico. Quando o assunto é óculos de grau, a marca se tornou sinônimo de tendência, liberdade, ousadia e estilo. Cada armação é criada pensando em levar a melhor experiência ao usuários, desde a qualidade do produto até os designs únicos e originais, que vão fazer toda a diferença no seu look. Além disso, uma das prioridades dos óculos de grau Ray-Ban é oferecer mais conforto e bem-estar visual.
Ray-Ban desde 1937
Cor da Armação: Tartaruga Amarelo/Azul
Material da Armação: Acetato
Medidas
Tamanho:
50 mm
19 mm
42 mm
122 mm
145 mm
Apresentação
A Ray-ban é uma marca criadora de tendências, que sempre inova e ousa em suas armações. A marca, que é conhecida no mundo todo como uma das líderes no mercado óptico, possui uma história plena e de extremo sucesso, se tornando uma das marcas mais renomadas do nicho.
Itens inclusos
Estojo Ray-Ban
Pano de limpeza
Termo de Garantia
entrega grátis
marca original
1ª troca grátis
desconto à vista
Opiniões sobre o produto
Avaliar Produto
Indique a um amigo
Perguntas e responsas
Este produto ainda não foi
avaliado.
Avaliar produto
Preencha seus dados, avalie e clique no botão Avaliar Produto.
Indique a um amigo
Preencha os campos abaixo e clique em Indicar Produto.
A sua indicação será enviada para o e-mail especificado.
Este site usa cookies para oferecer a melhor experiência possível. Ao utilizar nossos serviços, você concorda com o uso dos cookies.
/* newlentes — Fotos de quem comprou nas avaliacoes do produto (LIVO-4917).
*
* COLA-SE NO GESTOR DE SCRIPTS DA WAKE, na ficha de produto.
*
* newlentes nao tem repositorio: aqui nao ha PR, nem revisao, nem rollback
* por git. O que se cola fica em producao. Por isso a fonte deste ficheiro
* vive no repositorio do Command Center, em
* public-edge/newlentes/fotos-avaliacoes.js — para que exista um sitio onde
* ler o que esta aqui, e um historico de quando mudou. Editar la primeiro.
*
* E O MESMO DESENHO DA FICHA DE LIVO, com uma diferenca: la o bloco de
* opinioes e nosso e por isso tem atributos proprios (data-ts, data-autor).
* Aqui e o bloco NATIVO da Wake, entao os quatro campos leem-se do HTML que
* ela gera: #avaliacao-Produto .review, com .lr-nota, .reviewUser,
* .reviewData e o blockquote.
*
* O CRUZAMENTO NAO E ADIVINHACAO: data, nota, autor e inicio do comentario
* sao exatamente os quatro campos que o Command Center enviou a Wake ao
* publicar a avaliacao. Le-se o que de la se pos.
*
* SE ALGO FALHAR, A FICHA FICA COMO ESTA. As fotos sao um acrescimo, nunca
* uma dependencia do bloco de opinioes.
*/
(function () {
"use strict";
var BASE = "https://meu.newlentes.com.br";
var PREFIXO = BASE + "/m/review/";
// O id do produto vem do fim do URL (.../lentes-de-contato-biofinity-71305).
// E o mesmo numero com que o Command Center publica o indice.
var PRODUTO = (location.pathname.match(/-(\d+)\/?$/) || [])[1];
if (!PRODUTO) return;
/* ESPERAR PELO BLOCO DE OPINIOES.
*
* Na ficha de livo este codigo vive DENTRO do template, logo a seguir ao
* HTML das opinioes, por isso elas ja la estao. Aqui entra pelo Gestor de
* Scripts e corre quando a Wake o colocar — que pode ser antes de a lista
* existir. Sem esperar, a maior parte das visitas nao pintaria nada e o
* erro seria invisivel: a ficha fica igual, so sem fotos.
*
* Sondagem com tecto: se ao fim de ~12s nao ha lista, e que esta ficha nao
* tem opinioes e nao ha nada que fazer.
*/
function quandoHouverLista(cb) {
var tentativas = 0;
(function olhar() {
var el = document.getElementById("avaliacao-Produto");
if (el && el.querySelector(".review")) return cb(el);
if (++tentativas > 40) return;
setTimeout(olhar, 300);
})();
}
function normalizar(t) {
return (t || "")
.toLowerCase()
.normalize("NFD").replace(/[`-?]/g, "")
.replace(/\s+/g, " ")
.trim();
}
function chave(ts, nota, autor) {
return ts + "|" + nota + "|" + normalizar(autor);
}
/* Os quatro campos de uma opiniao, tal como a Wake os pinta. */
function dadosDa(el) {
var nota = parseInt((((el.querySelector(".lr-nota b") || {}).textContent) || "").trim(), 10);
// dd/mm/aaaa -> aaaammdd, que e como vem no indice.
var data = (((el.querySelector(".reviewData") || {}).textContent) || "").trim();
var m = data.match(/(\d{2})\/(\d{2})\/(\d{4})/);
var ts = m ? m[3] + m[2] + m[1] : "";
// .reviewUser traz tambem a etiqueta escondida ("Muito Ruim") e a data.
// O nome e o primeiro span que nao e nenhuma das duas.
var autor = "";
var u = el.querySelector(".reviewUser");
if (u) {
var spans = [].slice.call(u.querySelectorAll("span"));
for (var i = 0; i < spans.length; i++) {
var s = spans[i];
if (s.className && /hide|reviewData/.test(s.className)) continue;
if (s.querySelector && s.querySelector("span")) continue;
autor = s.textContent;
break;
}
}
var texto = (((el.querySelector("blockquote") || {}).textContent) || "")
.replace(/^[\s"“”]+/, "")
.replace(/[\s"“”]+$/, "");
return { ts: ts, nota: isNaN(nota) ? "" : String(nota), autor: autor, texto: texto };
}
function pintar(el, fotos) {
var cx = document.createElement("div");
cx.style.display = "flex";
cx.style.flexWrap = "wrap";
cx.style.gap = "8px";
cx.style.marginTop = "8px";
fotos.forEach(function (f) {
// So as nossas: a URL tem de vir do prefixo onde o Command Center
// publica. Assim um indice adulterado nao mete uma imagem de fora.
if (!f || typeof f.url !== "string" || f.url.indexOf(PREFIXO) !== 0) return;
var a = document.createElement("a");
a.href = f.url;
a.target = "_blank";
a.rel = "noopener noreferrer";
a.style.display = "block";
a.style.border = "1px solid #e2e8f0";
a.style.borderRadius = "8px";
a.style.overflow = "hidden";
var img = document.createElement("img");
img.src = f.url;
img.alt = "Foto enviada por quem comprou";
img.loading = "lazy";
img.decoding = "async";
img.style.width = "96px";
img.style.height = "96px";
img.style.objectFit = "cover";
img.style.display = "block";
if (f.w) img.width = f.w;
if (f.h) img.height = f.h;
a.appendChild(img);
cx.appendChild(a);
});
if (cx.childNodes.length) el.appendChild(cx);
}
// GET simples, sem cabecalhos nossos: o behavior do CDN nao aceita OPTIONS,
// entao qualquer cabecalho proprio dispararia um preflight que falharia.
function pedir(rota) {
return fetch(BASE + rota, { credentials: "omit" })
.then(function (r) { return r.ok ? r.json() : null; });
}
function temFotos(manifesto) {
var ids = manifesto && manifesto.productos;
if (!Array.isArray(ids)) return false;
for (var i = 0; i < ids.length; i++) {
if (String(ids[i]) === PRODUTO) return true;
}
return false;
}
// Primeiro o manifesto: um indice que nao existe chega como erro de CORS
// (o S3 responde 403 e a pagina de erro do CloudFront sai sem cabecalhos),
// e a maioria dos produtos nao vai ter fotos.
//
// A loja vai na rota: o bucket e UM so para os tres dominios e cada tenant
// da Wake numera os seus produtos a parte.
quandoHouverLista(function (lista) {
pedir("/d/fotos/newlentes/productos.json")
.then(function (manifesto) {
if (!temFotos(manifesto)) return null;
return pedir("/d/fotos/newlentes/" + encodeURIComponent(PRODUTO) + ".json");
})
.then(function (dados) {
if (!dados || !Array.isArray(dados.opinioes)) return;
// Cada entrada gasta-se numa opiniao e nao mais: duas pessoas com o
// mesmo nome, no mesmo dia e com a mesma nota nao podem ficar com as
// fotos uma da outra.
var porChave = {};
dados.opinioes.forEach(function (o) {
var k = chave(o.ts, o.nota, o.autor);
(porChave[k] = porChave[k] || []).push(o);
});
[].slice.call(lista.querySelectorAll(".review")).forEach(function (el) {
var d = dadosDa(el);
var candidatos = porChave[chave(d.ts, d.nota, d.autor)];
if (!candidatos || !candidatos.length) return;
var i = 0;
if (candidatos.length > 1) {
// Desempate pelo comentario, o unico campo que resta.
var texto = normalizar(d.texto);
i = -1;
for (var j = 0; j < candidatos.length; j++) {
if (texto.indexOf(normalizar(candidatos[j].texto)) === 0) { i = j; break; }
}
if (i < 0) return;
}
pintar(el, (candidatos.splice(i, 1)[0] || {}).fotos || []);
});
})
.catch(function () { /* sem fotos, a ficha fica como esta */ });
});
})();