admin管理员组

文章数量:1336408

I have a html page where there is counter starts on page loading. But the problem is if someone refresh or reloads the page the counter restarts. I dont know how to use local storage or cookies to make sure my counter does not reset upon reload. I am aware of the similar questions available here but my issue is i want local storage to be part of a function (countDown()).

Here is the code I tried:

<script>

    var timer;

    function countDown(i, callback) {
        //callback = callback || function(){};
        timer = setInterval(function() {
            minutes = parseInt(i / 60, 10);
            seconds = parseInt(i % 60, 10);

            minutes = minutes < 10 ? "0" + minutes : minutes;
            seconds = seconds < 10 ? "0" + seconds : seconds;

            document.getElementById("displayDiv ").innerHTML = "Time (h:min:sec) left for this station is  " + "0:" + minutes + ":" + seconds;

            i-- || (clearInterval(timer), callback());
        }, 1000);
    }

    window.onload = function() {
        countDown(60, function() {
            $('#myModal').modal('show');
        });
    };
</script>

I have a html page where there is counter starts on page loading. But the problem is if someone refresh or reloads the page the counter restarts. I dont know how to use local storage or cookies to make sure my counter does not reset upon reload. I am aware of the similar questions available here but my issue is i want local storage to be part of a function (countDown()).

Here is the code I tried:

<script>

    var timer;

    function countDown(i, callback) {
        //callback = callback || function(){};
        timer = setInterval(function() {
            minutes = parseInt(i / 60, 10);
            seconds = parseInt(i % 60, 10);

            minutes = minutes < 10 ? "0" + minutes : minutes;
            seconds = seconds < 10 ? "0" + seconds : seconds;

            document.getElementById("displayDiv ").innerHTML = "Time (h:min:sec) left for this station is  " + "0:" + minutes + ":" + seconds;

            i-- || (clearInterval(timer), callback());
        }, 1000);
    }

    window.onload = function() {
        countDown(60, function() {
            $('#myModal').modal('show');
        });
    };
</script>
Share Improve this question edited Aug 21, 2020 at 6:10 Valentino Ru 5,05212 gold badges44 silver badges79 bronze badges asked Aug 21, 2020 at 4:28 ms kk rrms kk rr 731 silver badge5 bronze badges 2
  • 2 Does this answer your question? wants javascript countdown to continue from where it was even after refresh – kelvin Commented Aug 21, 2020 at 4:30
  • @kelvin thanks for pointing me. I tried this but my requirement is showing up a modal upon countdown being zero that is where I failed to use that code. – ms kk rr Commented Aug 21, 2020 at 4:51
Add a ment  | 

4 Answers 4

Reset to default 3

First, persist your current counter value to the session storage (with a specific key) at each iteration. You may only persist/update the value when the counter is greater than 0, and then clear the storage key once counter reached 0.

const COUNTER_KEY = 'my-counter';

function countDown(i, callback) {
  //callback = callback || function(){};
  timer = setInterval(function() {
    minutes = parseInt(i / 60, 10);
    seconds = parseInt(i % 60, 10);

    minutes = minutes < 10 ? "0" + minutes : minutes;
    seconds = seconds < 10 ? "0" + seconds : seconds;

    document.getElementById("displayDiv").innerHTML = "Time (h:min:sec) left for this station is  " + "0:" + minutes + ":" + seconds;

    if ((i--) > 0) {
      window.sessionStorage.setItem(COUNTER_KEY, i);
    } else {
      window.sessionStorage.removeItem(COUNTER_KEY);
      clearInterval(timer);
      callback();
    }
  }, 1000);
}

Then on the window.onload function, first check if there is a value under the above key on the session storage. If a value is there, start the countdown from that value. Otherwise, start from your default value (60).

window.onload = function() {
  var countDownTime = window.sessionStorage.getItem(COUNTER_KEY) || 60;
  countDown(countDownTime, function() {
    $('#myModal').modal('show');
  });
};

You can try using localStorage as follows:

var timer;

function countDown(i, callback) {
    //callback = callback || function(){};

    timer = setInterval(function () {
        minutes = parseInt(i / 60, 10);
        seconds = parseInt(i % 60, 10);

        minutes = minutes < 10 ? "0" + minutes : minutes;
        seconds = seconds < 10 ? "0" + seconds : seconds;

        document.getElementById("displayDiv").innerHTML = "Time (h:min:sec) left for this station is  " + "0:" + minutes + ":" + seconds;

        // update the persisted time interval
        localStorage.setItem('timeLeft', i);

        i-- || (clearInterval(timer), callback());

    }, 1000);
}

window.onload = function () {
    let timeInterval = 100;
    //check if you have the last counter value
    let timeLeft = localStorage.getItem('timeLeft');
    if (isNaN(timeLeft)) {
        //save the current interval
        localStorage.setItem('timeLeft', timeInterval);
    } else if (timeLeft == 0) {
        //save the current interval
        localStorage.setItem('timeLeft', timeInterval);
    } else {
        // take the last saved value
        timeInterval = timeLeft;
    }

    countDown(timeInterval, function () {
        $('#myModal').modal('show');
    });
};

I think what you want is a property called sessionStorage which stores information in the browser permanently. here's a link explaining it

https://www.w3schools./jsref/prop_win_sessionstorage.asp

I have a made a promise based function for this.

It uses localStorage to store the countdown every 1 second and, once the time is over, it returns you a promise.

I use it with React and React Router on production, it's been working great.

    function countdown(interval = 5000) {
      return new Promise(async (resolve, reject) => {
        let intervalLoop = null

        function countTimer() {
          if (!localStorage.endTime) {
            localStorage.endTime = +new Date() + interval
          }

          let remaining = localStorage.endTime - new Date()
          if (remaining >= 0) {
            let currentTime = Math.floor(remaining / 1000)
            console.log("Countdown current time:", currentTime)
          } else {
            clearInterval(intervalLoop)
            resolve(true)
          }
        }

        intervalLoop = setInterval(countTimer, 1000)
      })
    }

Make sure you are inside an async function to use it:

(async _ => {
      console.log("Countdown starts now...")
      await countdown(5000)
      console.log("Countdown is over!");
    })()

本文标签: javascriptCountdown timermake it persistent even after refresh or reloadStack Overflow