2013-05-14 5 views
1

J'ai un problème étrange que je rencontre seulement sur l'IPAD. Il semble que tous les autres navigateurs peuvent gérer cela très bien, mais j'ai une condition similaire à ceci:Odd ParseFloat Éditer Javascript

if(parseFloat($('#element1').css('opacity'),10).toFixed(2)!=userSetting1 || 
    parseFloat($('#element2').css('opacity'),10).toFixed(2)!=userSetting2 
){ return; }; 

... rest of function 

Donc, au fond, j'ai deux ou trois éléments qui animent d'une action de l'utilisateur. Pour empêcher l'utilisateur de continuer à allumer le reste de la fonction, je suis en train de tester si l'élément a fini d'animer son opacité. Usersetting1 et 2 sont les opacités que l'utilisateur définit element1 et 2 pour animer respectivement. Donc, fondamentalement, si l'opacité n'a pas atteint l'opacité définie par l'utilisateur, elle disparaît de la fonction. Fonctionne très bien partout sauf l'iPad et il est basé sur un problème avec parseFloat. Si l'utilisateur définit 0.15, 0.25, etc comme paramètre d'opacité, alors le paramètre parseFloat (, 10) .toFixed (2) fonctionnera et permettra à la condition de tester correctement. Toutefois, si l'utilisateur définit 1 ou 0 pour l'opacité, il vissera tout. Apparemment, l'iPad ne pense pas que 1.0 = 1.

S'il y a un moyen de contourner cela?

+0

certains des formats de code les plus étranges que j'ai jamais vu. mais +1 bonne question. – sgroves

+0

Peut-être qu'il devient «0.99» pour une raison quelconque? J'ai le sentiment que cela a quelque chose à voir avec l'arithmétique en virgule flottante. Bien que je ne sois pas sûr de ce que votre 'parseFloat (, 10) .toFixed (2)' est ... – Ian

+0

jQuery peut faire $ ('element'). Is (': animated') pour tester si quelque chose est en train d'animer, peut-être c'est un meilleur test à faire que de comparer les valeurs des chaînes d'opacité. http://api.jquery.com/animated-selector/ –

Répondre

0

Ok, je viens de comprendre cela. L'iPad semble animer mon élément (disons si userSetting1 était 0.15) à 0.1503850384038439248. J'ai donc dû exécuter le fichier .toFixed (2) à la fois sur le paramètre utilisateur et sur le fichier .css pull.

0
var iOS = parseFloat(('' + (/CPU.*OS ([0-9_]{1,5})|(CPU like).*AppleWebKit.*Mobile/i.exec(navigator.userAgent) || [0,''])[1]) 
    .replace('undefined', '3_2').replace('_', '.').replace('_', '')); 
if(iOS ($('#element1').css('opacity'),10).toFixed(2)!=userSetting1 || 
iOS ($('#element2').css('opacity'),10).toFixed(2)!=userSetting2){ return; };