【问题标题】:Odd ParseFloat Issue Javascript奇怪的 ParseFloat 问题 Javascript
【发布时间】:2013-05-14 20:55:57
【问题描述】:

我有一个奇怪的问题,我只在 iPad 上遇到过。似乎所有其他浏览器都可以很好地处理这个问题,但我有一个类似的情况:

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

... rest of function

所以,基本上我有几个元素可以根据用户操作进行动画处理。为了防止用户连续触发该功能的其余部分,我正在测试该元素是否已完成对其不透明度的动画处理。 usersetting1 和 2 是用户将 element1 和 2 分别设置为动画的不透明度。

所以,基本上,如果不透明度没有达到用户设置的不透明度,它就会退出该功能。除了 iPad 之外,它在任何地方都可以很好地工作,而且它基于 parseFloat 的问题。

如果用户将 0.15、0.25 等设置为他们的不透明度设置,则 parseFloat(,10).toFixed(2) 将起作用并允许条件正确测试。

但是,如果用户将不透明度设置为 1 或 0,则会搞砸一切。显然 iPad 不认为 1.0 = 1。

如果有办法解决这个问题?

【问题讨论】:

  • 一些我见过的最奇怪的代码格式。但是 +1 好问题。
  • 可能因为某种原因变成了0.99?我感觉它在某种程度上与浮点运算有关。虽然我不确定你的parseFloat(,10).toFixed(2) 是什么...
  • jQuery 可以使用 $('element').is(':animated') 来测试是否有动画效果,也许这比比较不透明度字符串值更好。 api.jquery.com/animated-selector
  • 比较浮点数时,最好使用<= 或类似的比较,而不是toFixed==,因为您可能会得到非常小的舍入差异,使它们@ 987654327@。例如if (x - userSetting <= 1e-10)

标签: javascript jquery ipad parsefloat


【解决方案1】:

好的,刚刚想通了。 iPad 似乎将我的元素(比如 userSetting1 为 0.15)设置为 0.1503850384038439248。所以,我必须在用户设置和 .css 拉取上都运行 .toFixed(2)。

【讨论】:

    【解决方案2】:
     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; };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-02
      • 1970-01-01
      • 1970-01-01
      • 2011-08-23
      • 1970-01-01
      • 1970-01-01
      • 2012-06-17
      相关资源
      最近更新 更多