Pauză setTimeout la ieșire din fereastră

Discutii si intrebari legate de scripturi si functii JavaScript, jQuery si Ajax, cod JavaScript in general.
Marius
Mesaje:60

Pauză setTimeout la ieșire din fereastră

Codul de mai jos trimite un 'event' 30s la Google Analytics după 30 de secunde când un utilizator intră pe pagină.

Cod: Selectaţi tot

setTimeout(function(){
   gtag('event', '30s');
}, 30000);
Dar când utilizatorul minimizează fereastra, evenimentul încă se declanșează.

Ceea ce vreau este o modalitate de a pune pauza la setTimeout când utilizatorul minimizează pagina și, când maximizează pagina, timpul din setTimeout sa continue să se numere din momentul în care s-a oprit.
E vreo modalitate de a face asta?

MarPlo Mesaje:4343
Poti sa urmăresti când o pagină își pierde focalizarea utilizând 'visibilitychange'. Când vizibilitatea se schimbă, poti folosi 'document.hidden' pentru a vedea dacă documentul este ascuns.
Când este ascuns, opresti setTimeout și retii timpul rămas într-o variabilă; când pagina este afișata, setezi un setTimeout cu timpul rămas.
Cam asa:

Cod: Selectaţi tot

let run = false;
const fn = () => {
  gtag('event', '30s');
  run = true;
};
let timeoutId;
let runAt;
let timeLeft = 30_000;
const resume = () => {
  runAt = Date.now() + timeLeft;
  timeoutId = setTimeout(fn, timeLeft);
};
resume();

document.addEventListener('visibilitychange', () => {
  if (document.hidden) {
    timeLeft = runAt - timeLeft;
    clearTimeout(timeoutId);
  }
  else if (!run) resume();
});