2016-01-26 14 views
12

Chromeでは、ユーザーがすべてのXHRをスクロールしていて、スクロールが止まるまでsetTimeoutsが遅れてしまう場合があります。この動作はthis blog postで説明されています。この機能はモバイルスクロールに役立ちますが、無限のスクロールでは悲惨です。これは私がやろうとしていることです。これが起こっているXHR/setTimeout/Chromeでスクロールが停止するまでプロミスが終了しない

証拠:他のすべてのブラウザでは正常に動作

  • ユーザーがスクロールを停止するまで、Chromeは空の画面が表示されます。スクロールが終わるまで

  • ネットワークパネルには、一度にすべての彼らの仕上げ、その後、pendingとしてすべての要求が表示されます。

  • これをスニペットに入れて実行し、すぐにスクロールを開始します。 setTimeoutは、スクロールが終了するまで呼び出されません。

var p = new Promise(function (resolve) { 
    setTimeout(function() { 
     console.log('resolving'); 
     resolve(); 
    }, 1000) 
}); 

p.then(function() { 
    console.log('DONE!!'); 
}) 
+0

はかなりのsetTimeout() 'を助けるために起こる' 'よりもrequestAnimationFrameのを()'使用していますか?ブログの投稿では、ユーザーエクスペリエンス(何がしているか)が損なわれないように、ChromeがアニメーションとGPU関連のタスクに優先順位を付けることが明確になっています。 – arthurakay

+0

はい、あります!しかし、それは無限スクロールにとって重要なXHRには役立ちません。 – sakabako

+0

私はこの正確な問題を抱えています、答えを得るのが大好きです。あなたのために恩恵を始めました。 –

答えて

1

これはエンジンに関係しているので、私は回避策が可能であるとは思いません。代わりにChromeチームにバグレポートを提出しました。

https://bugs.chromium.org/p/chromium/issues/detail?id=661155

+0

SoundCloudや他のウェブサイトにこの問題がないのはどうですか?それを防ぐ方法は間違いありません。 –

+0

私は実際これを再現するのに問題があります。上記のタイムアウトコードを使ってクイックページを作成したところ、スクロールしながらコンソール出力が得られました。 –

+0

XHRのようなもので試してみてください。それは私が問題を抱えているところです。 –

5

あなたの正確なシナリオと希望ブラウザのサポートによって、私はService Workers試してみた - そのようなあなたが取り扱いしている(と、すべてのトラフィックを傍受することができます)1などの作業のために意図されている、またはWeb Workerへのdo your AJAXをバックグラウンドに含む。

1

私はこれが、このChromeの機能に関連している可能性が信じている:

https://www.chromestatus.com/feature/5745543795965952(パッシブイベントリスナー)

Chromeはそう時々イベントをtouchmoveすることができます聞いて、ユーザーがスクロールしているとき、モバイル上で仕事をして回避しようと遅延ハンドラが実行され、タイムアウトが発生します。

デモ:
https://rbyers.github.io/scroll-latency.html
(ハンドラJankをチェックして、ページをスクロール)

+0

私は、第三者のlibからいくつかの望ましくないタッチリスナーが来たことを示すdevツールを確認しました。このlibを無効にすると、スクロールの問題が解決しました。 –

+0

私は「マウスホイール」イベントに空のイベントリスナーを追加し、それは(ここではhttps://stackoverflow.com/a/47684257/6111857提案に似ています)私のためにそれを固定 – NDavis

関連する問題