2016-01-26 39 views
12

In Chrome, se l'utente sta scorrendo tutti gli XHR e setTimeouts verrà ritardato fino allo stop dello scorrimento e ho bisogno di una soluzione alternativa per questo. Il comportamento è descritto in this blog post. Sebbene questa funzionalità aiuti lo scorrimento mobile, è disastrosa per lo scroll infinito, che è quello che sto cercando di fare.XHR/setTimeout/Promessa non finita finché lo scorrimento non si interrompe in Chrome

prove che questo sta accadendo:

  • Tutti gli altri browser funzionano bene, Chrome mostra uno schermo vuoto fino a quando l'utente smette di scorrere.

    pannello
  • La rete mostrerà tutte le richieste come pending fino scrolling è finita, allora tutte le finiture in una volta.

  • Inserire questo in uno snippet, eseguirlo quindi iniziare a scorrere immediatamente. Il setTimeout non verrà chiamato fino a quando non terminerà lo scorrimento.

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

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

costa usare 'requestAnimationFrame()' invece di 'setTimeout()' accadere per aiutare? Il post del blog rende abbastanza chiaro che Chrome sta dando la priorità alle attività di animazione e GPU in modo che l'esperienza dell'utente (ciò che sta facendo) non ne risenta. – arthurakay

+0

Sì, lo fa! Tuttavia, questo non aiuta con XHR, che è ciò che conta per lo scroll infinito. – sakabako

+0

Sto avendo questo problema esatto, mi piacerebbe avere una risposta. Ha iniziato una taglia per te. –

risposta

1

Dal momento che questo ha a che fare con il motore, non credo che una soluzione è possibile. Invece ho presentato una segnalazione di bug con il team di Chrome.

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

+0

In che modo SoundCloud e altri siti Web non presentano questo problema? C'è sicuramente un modo per prevenirlo. –

+0

In realtà sto avendo problemi a riprodurre questo. Ho appena creato una pagina veloce con il codice di timeout sopra, e ottengo l'output della console durante lo scorrimento. –

+0

Provalo con qualcosa come XHR. Ecco dove sto avendo problemi. –

5

A seconda dello scenario esatto e il supporto del browser desiderato, mi piacerebbe provare Service Workers - che sono pensati per compiti come quello che stai movimentazione (e può intercettare tutto il traffico), o un Web Worker per do your AJAX sullo sfondo.

1

Credo che questo potrebbe essere correlato a questa funzione Chrome:

https://www.chromestatus.com/feature/5745543795965952 (listener di eventi passivi)

Chrome cerca di evitare di fare il lavoro sul cellulare quando l'utente scorre, in modo da ascoltare TouchMove eventi a volte può ritardare l'esecuzione dei gestori e interrompere i timeout.

Demo:
https://rbyers.github.io/scroll-latency.html
(controllare Handler Jank e scorrere nella pagina)

+0

Ho controllato gli strumenti di sviluppo che mostravano alcuni ascoltatori di tocco indesiderati provenienti da una lib di terze parti.La disabilitazione di questa libreria ha risolto i problemi della mia scroll. –

+0

Ho aggiunto un evento listener vuoto all'evento "mousewheel" e l'ho risolto per me (simile al suggerimento qui https://stackoverflow.com/a/47684257/6111857) – NDavis