2016-07-28 12 views
14

次のコードでいくつかの奇妙な動作が発生しています。遅延ロードがときどき角度で動作しない

function linkFunc(scope, element, attribute) { 
     var page = angular.element($window); 

     page.bind('scroll', function() { 

      var windowHeight = "innerHeight" in window ? window.innerHeight : document.documentElement.offsetHeight; 
      var body = document.body, html = document.documentElement; 
      var docHeight = Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight); 
      var windowBottom = windowHeight + window.pageYOffset; 

      if (windowBottom >= docHeight) { 
       scope.$apply(attribute.myDirective); 
      } 
     }); 
    } 

上記は、ページの下部に到達したかどうかを検出するコードの一部であるその達した場合、それが主な問題は、時間のほとんどであるmyDirective

にどんな機能バインドを呼び出します遅延ロードが機能し、myDirectiveが正常に呼び出されます。しかし、怠惰な読み込みはうまくいかず、私はバグを再現できませんでした。

私は別の画面サイズ、別のブラウザを試しましたが、バグがランダムに発生するようです。

誰かがこれまでにそれらに起こったことがありますか、私に方向性を指摘することができますか?

編集:

詳しい情報

私は実験の少し後にバグを再現することができました。ブラウザの割合でズームが< 100 %とき

基本的には、window.pageYwindowBottom0.1

例えば0.9にでオフにさせるその少し不正確である10進値を返します。

  console.log(windowBottom); // 1646.7747712336175 
      console.log(docHeight); // 1647 

これはなぜ起こるのですか?

編集2:

上記の動作も非決定論的であるが、小数部が真です。 !

+1

これは、角度の付いたディレクティブを設計するためのやや珍しい方法です。特定のUIイベントにJavaScriptの実行を結びつけるための角度の設計原則に反します。 – Claies

+0

画面の一番下にChromeの開発コンソールがありませんか?私には、類似したコードの高さ知覚にちょっと変わった影響を与えることができると私には思えます。 – cYrixmorten

+0

@cYrixmorten画面の一番下にChromeのデベロッパーコンソールがありませんでしたが、これを試しましたが、動作はまだ決定的ではありません。 – testing

答えて

3

0.1 + 0.2 == 0.3

この1つだけではなく、JavaScriptで風変わりです。実際にはコンピュータサイエンスの一般的な問題であり、多くの言語に影響します。これの出力は0.30000000000000004です。

これは、機械精度と呼ばれる問題と関連しています。上記の行をJavaScriptが実行しようとすると、値は2進数に変換されます。 ここが問題の始まりです。 0.1は実際には0.1ではなく、バイナリの等価物であり、これはほぼish(同じではない)値です。本質的には、値を書き込むとすぐに、それらの精度を失うことになります。 2つの単純な小数点がほしいと思っただけかもしれませんが、Chris Pineが指摘しているように、バイナリ浮動小数点演算です。あなたのテキストをロシア語に翻訳したいが、Belorussianを得たいと思うようなもの。同様ですが、同じではありません。

hereを読むことができます。ブラウザのソースを掘り下げることなく、私はあなたの問題がこれに由来すると推測します。

+0

Downvoted。 OPの質問に答えないか、問題を解決します。 – DhruvPathak

+0

アップ票。それは質問に答える。あなたが質問への追加を読んだら、JavaScriptが数学的操作をどのように扱うかという問題が出ています。 –

+0

@DhruvPathak "なぜこのようなことが起こるのか誰にも分かりますか?"彼はすでに彼自身の犯人を発見しているので、最終的にOPの質問です – adamdport

3

浮動小数点精度の問題がある場合、2つの値が1ピクセルよりも小さい場合は、条件を緩和して確認することができます。例:

if (Math.abs(windowBottom - docHeight) < 1) { 
    scope.$apply(attribute.myDirective); 
} 
+0

素晴らしい!これは私にmcgraphixを助けた:) –

関連する問題