Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

gustavopinent

[Resolvido] Bug do Google Chrome!

Recommended Posts

Fiz um slideshow em JavaScript simples. O php carrega umas imagens e dados da base e passa para o javascript que fica clareando e escurecendo uma div atrás da outra dando a sensação de slideshow - nada que não tenha pilhas de exemplos por aí, mas eu quis fazer a minha!

 

Funciona perfeito no Safari e no FireFox, mas nada de rodar no Google Chrome (para Mac)!

 

Após examinar o comportamento de cada variável descobri o bug na forma do número 1.3877787807814457e-16 que é a subração sucessiva da opacidade da div em 0.1.

 

Ou seja, a div começa com 1 (opaco) e eu vou subraindo 0.1 a cada 100ms até que dá zero (transparente) e passa para a próxima div que eu vou acrescendo 0.1 a partir do zero até chegar a 1 - voilá!

 

Esta é a parte que trava:

 

id_slide = 'slide_'+String(slideShowSlide);
slideShowJan = document.getElementById(id_slide);
slideShowJanOpc = Number(slideShowJan.style.opacity);
if(slideShowJanOpc>0){
slideShowJanOpc -= 0.1;
slideShowJan.style.opacity = String(slideShowJanOpc);
} else {
slideShowJan.style.visibility = 'hidden';
slideShowSlide = slideShowNext;
slideShowTimer = slideShowDelay;
}

 

Como 1.3877787807814457e-16 é maior que zero, ele repete a subtração mas não arredonda para zero. Um bug duplo pois o conjunto utilizado é 1 a 0, então um número negativo deveria gerar um erro ou ser considerado zero (é o que os outros navegadores fazem) além do fato da subtração 0.1 sucessiva gerar este bizarro resultado.

 

Segue a correção:

 

id_slide = 'slide_'+String(slideShowSlide);
slideShowJan = document.getElementById(id_slide);
slideShowJanOpc = Number(slideShowJan.style.opacity);
if(slideShowJanOpc>=0.1){
slideShowJanOpc -= 0.1;
slideShowJan.style.opacity = String(slideShowJanOpc);
} else {
slideShowJan.style.visibility = 'hidden';
slideShowSlide = slideShowNext;
slideShowTimer = slideShowDelay;
}

 

Ou seja, se chegar próximo de zero, eu já mando pro próximo!

 

No ActionScript eu já me habituei a trabalhar com <= >= mas no JavaScript ainda não tinha aparecido este tipo de problema!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como 1.3877787807814457e-16 é maior que zero, ele repete a subtração mas não arredonda para zero.

okay.. é maior que zero (pouca coisa, mas é.. hehe)

 

 

então um número negativo deveria gerar um erro ou ser considerado zero

mas não tem numero negativo.. se é maior que zero, então é positivo.

 

não deveria chegar nesse teu numero. Pois se você diminuir de decimo em decimo, depois de 10 iterações chegara no zero.

o problema do Chrome (chuto eu), é que qndo ele tenta fazer a conta:

 

0.1 - 0.1, isso não da zero, por isso continua fazendo...

tente debugar para ver se oque estou falando está correto. Se estiver, a forma simples de resolver é trabalhar com inteiros.

 

e então na hora de aplicar a opacidade, você pega esse inteiro e divide por 10 :lol:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Perfeito. Foi o que eu fiz. A solução abaixo deverá ser ainda mais à prova de cálculos bizarros:

 

id_slide = 'slide_'+String(slideShowSlide);
slideShowJan = document.getElementById(id_slide);
slideShowJanOpc = Number(slideShowJan.style.opacity)*10;
if(slideShowJanOpc>=1){
slideShowJanOpc--;
slideShowJan.style.opacity = String(Math.round(slideShowJanOpc)/10);
} else {
slideShowJan.style.visibility = 'hidden';
slideShowSlide = slideShowNext;
slideShowTimer = slideShowDelay;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.