Uruchomienie funkcji po określonym czasie nawet po przeładowaniu

0

Cześć,
wiem, że żeby odpalić jakąś funkcję trzeba zrobić po prostu:

setTimeout(yourFunction, 5000);

Chciałbym jednak żeby ten czas był liczony dalej nawet po przeładowaniu strony albo załadowaniu podstrony i był kontrolowany aż do zamknięcia całej witryny.

Możecie mi pomóc albo nakierować na rozwiązanie?

1
setInterval(() => { console.log(1); }, 5000);

O to chodzi?

0

Moze zle opisalem. Chce odpalic funkcje np po 5 sekundach od wejscia na strone nawet jezeli uzytkownik w tym czasie wejdzie na inna podstrone.

1

Zanim zatrzymasz timer, zapisz pozostaly czas. Kiedy user wroci na strone ustaw setTimeout na czas zapisany w pierwszym kroku, a jako callback setTimeout uruchom interval.

0

Zrobiłem coś takiego. Niestety wydaje mi się, że strasznie zamula przeglądarkę i powoduje, że cały czas kręci się ładowanie strony podczas działania skryptu.
Pomożecie mi to zoptymalizować i zrobić tak żeby to sobie śmigało w tle? Cel osiągnąłem bo nawet po przeładowaniu strony odliczanie trwa dalej - tylko, ze na IE i Edge nie smiga:(



function setCookie(t) {
document.cookie = "IntervalCookie="+t.toString();
startCounter();
}

function getCookie() {
    var name = "IntervalCookie=";
    var ca = document.cookie.split(';');
    for(var i = 0; i < ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0) == ' ') {
            c = c.substring(1);
        }
        if (c.indexOf(name) == 0) {
            return parseInt(c.substring(name.length, c.length));
        }
    }
    return -1;
}

function checkCookie() {
    var user = getCookie();
    if (user < 0) {
        return false;
    } else {
        return true;
    }
} 

function DeleteCookie() {
document.cookie = "IntervalCookie=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;";
}


function startCounter() {

      if(checkCookie()) {
      var cookie = getCookie();

      if (cookie > 0) {

       		document.write(cookie);
       		setTimeout (function() {setCookie(cookie-1); }, 1000);
       }
      else{

        	document.write('Koniec');
        	DeleteCookie();

       }
       
       }
       else
       {
       setCookie(25);
       }
     }
     
     startCounter();


https://jsfiddle.net/pknwcg2z/26/

Znalazłem jeszcze gotowca w jquery. Potestuje i możliwe, że będzie lepszy niż moje wypociny. On jest oparty o localStorage:

var updateTimer = function() {
    timer = localStorage.getItem('timer') || 0;
    if ( timer === 0 ) {
       $("div#timer").html("Timer is unset");
    } else {
       timer--;
       localStorage.setItem('timer', timer);
      $("div#timer").html(timer);
    }
};

$(function() {
    setInterval(updateTimer, 1000);
    $("#start").click( function() {
        localStorage.setItem('timer', 500);
    });
});

http://jsbin.com/oqamil/1/edit

1

Poniższy kodzik mierzy czas spędzony na stronie. Jeżeli chcesz, żeby timeout uwzględniał też czas poza stroną, to musisz go trochę zmodyfikować ;) Warto też dodać, że klucz w localStorage nie ma indeksu, w związku z czym możesz użyć tylko jeden taki timeout naraz. Oczywiście tak jak i w przypadku z czasem poza stroną można ten kod zmodyfikować.

Demo

(function () {

    function doSomething() {
        console.log('something');
    }

    function timeout(cb, delay) {
        var start = new Date();

        localStorage.setItem('timeout', delay);

        var interval = setInterval(function () {
            var end = new Date(),
                diff = end - start,
                timeLeft = localStorage.getItem('timeout') - diff;

            if (timeLeft <= 0) {
                cb();

                localStorage.removeItem('timeout');
                clearInterval(interval);
            } else {
                start = end;
                localStorage.setItem('timeout', timeLeft);
            }
        });
    }


    window.addEventListener('load', function (e) {
        var timer = localStorage.getItem('timeout') || 10000;

        timeout(doSomething, timer);
    });
})();
0

Ok, udało mi się osiągnąć cel :)
Potrzebowałem ten skrypt do wyświetlenia formatki do newslettera na stronie ale dopiero po pewnym czasie niezależnie od tego czy użytkownik jest na jednej podstronie czy sobie wędruje między kilkoma.
Kiedy licznik dojdzie do 0 ustawiane jest localStorage dzięki czemu przy ponownej wizycie na stronie timer się nie odpali. Jednocześnie kiedy timer odlicza, stronę można odświeżać a licznik i tak odlicza dalej od ostatniej wartości. Poniżej skrypt z komentarzami

var updateTimer = function() {
    timer = sessionStorage.getItem('timer'); //pobieramy ostatnią wartość timera
    if ( timer == 0 ) { //jeżeli odliczanie zakończone
       $("div#timer").html("GO!"); //odpalamy oczekiwaną akcję
       localStorage.setItem('newsletter', 'pierwszy'); //zapisujemy informację żeby więcej nie uruchamiać timera
    } else { //w przeciwnym wypadku liczymy dalej
       timer--;
       sessionStorage.setItem('timer', timer);
      $("div#timer").html(timer);
    }
};


$(function() {
    news = localStorage.getItem('newsletter') || 'brak';
    
    if (news === 'brak') { //sprawdzamy czy był już odpalany newsletter
	check = sessionStorage.getItem('timer');
	if (check === null) { //sprawdzamy czy było już odliczanie, jeżeli nie ustawiamy licznik
		sessionStorage.setItem('timer', 20);
	}
	
    setInterval(updateTimer, 1000); //odpalamy licznik
    }
});

1 użytkowników online, w tym zalogowanych: 0, gości: 1