How can this particular code work on page load itself and even on refresh of page timer value remains ticking only when click submit it stops?
I guess we need to store the timer on localStorage and destroy storage on click submit?
$(function() {
// Some global variables
var startTime = 0,
elapsed = 0,
timerId = 0,
$timer = $("#timer");
function formatTime(time) {
var hrs = Math.floor(time / 60 / 60 / 1000),
min = Math.floor((time - hrs * 60 * 60 * 1000) / 60 / 1000),
sec = Math.floor((time - hrs * 60 * 60 * 1000 - min * 60 * 1000) / 1000);
hrs = hrs < 10 ? "0" + hrs : hrs;
min = min < 10 ? "0" + min : min;
sec = sec < 10 ? "0" + sec : sec;
return hrs + ":" + min + ":" + sec;
}
function elapsedTimeFrom(time) {
return formatTime(time - startTime + elapsed);
}
function showElapsed() {
$timer.text(elapsedTimeFrom(Date.now()));
}
function startTimer() {
// React only if timer is stopped
startTime = startTime || Date.now();
timerId = timerId || setInterval(showElapsed, 1000);
localStorage.setItem('startTime');
}
function pauseTimer() {
// React only if timer is running
if (timerId) {
clearInterval(timerId);
elapsed += Date.now() - startTime;
startTime = 0;
timerId = 0;
}
}
function resetTimer() {
clearInterval(timerId);
$timer.text("00:00:00");
startTime = 0;
elapsed = 0;
timerId = 0;
}
function editTimer() {
pauseTimer();
$timer.prop("contenteditable", true);
$timer.css("border", "1px solid red");
}
function setElapsed() {
var time = $timer.text(),
arr = time.split(":");
$timer.prop("contenteditable", false);
$timer.css("border", "1px solid black");
elapsed = parseInt(arr[0] * 60 * 60, 10);
elapsed += parseInt(arr[1] * 60, 10);
elapsed += parseInt(arr[2], 10);
elapsed *= 1000;
}
function sendTime() {
pauseTimer();
// Set hidden input value before send
$("[name='time']").val(formatTime(elapsed));
}
$("[name='start']").click(startTimer);
$("[name='stop']").click(pauseTimer);
$("[name='reset']").click(resetTimer);
$timer.dblclick(editTimer);
$timer.blur(setElapsed);
$("form").submit(sendTime);
});<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div id="timer">00:00:00</div> </h1> <form action="" method="post" ame="xyz"> <input type="button" name="start" value="Start" class="btn btn-primary mb-2"> <input type="button" name="stop" value="Stop" class="btn btn-primary mb-2"> <input type="submit" name="action" value="Submit" class="btn btn-primary mb-2"> <input type="hidden" name="time" value="00:00:00"> </form>
Advertisement
Answer
You need to set the variable in localStorage not just the name
I have commented out the calls since they do not work in StackSnippets
Just uncomment them when you copy to your server.
$(function() {
// Some global variables
var startTime = 0;
elapsed = 0,
timerId = 0,
$timer = $("#timer");
function formatTime(time) {
var hrs = Math.floor(time / 60 / 60 / 1000),
min = Math.floor((time - hrs * 60 * 60 * 1000) / 60 / 1000),
sec = Math.floor((time - hrs * 60 * 60 * 1000 - min * 60 * 1000) / 1000);
hrs = hrs < 10 ? "0" + hrs : hrs;
min = min < 10 ? "0" + min : min;
sec = sec < 10 ? "0" + sec : sec;
return hrs + ":" + min + ":" + sec;
}
function elapsedTimeFrom(time) {
return formatTime(time - startTime + elapsed);
}
function showElapsed() {
$timer.text(elapsedTimeFrom(Date.now()));
}
function startTimer() {
// React only if timer is stopped
// startTime = localStorage.getItem('startTime') || Date.now();
startTime || Date.now(); // remove and uncomment above
timerId = timerId || setInterval(showElapsed, 1000);
// localStorage.setItem('startTime',startTime);
}
function pauseTimer() {
// React only if timer is running
if (timerId) {
clearInterval(timerId);
elapsed += Date.now() - startTime;
startTime = 0;
timerId = 0;
}
}
function resetTimer() {
clearInterval(timerId);
$timer.text("00:00:00");
startTime = 0;
elapsed = 0;
timerId = 0;
}
function editTimer() {
pauseTimer();
$timer.prop("contenteditable", true);
$timer.css("border", "1px solid red");
}
function setElapsed() {
var time = $timer.text(),
arr = time.split(":");
$timer.prop("contenteditable", false);
$timer.css("border", "1px solid black");
elapsed = parseInt(arr[0] * 60 * 60, 10);
elapsed += parseInt(arr[1] * 60, 10);
elapsed += parseInt(arr[2], 10);
elapsed *= 1000;
}
function sendTime() {
pauseTimer();
// Set hidden input value before send
$("[name='time']").val(formatTime(elapsed));
// localStorage.removeItem('startTime');
}
$("[name='start']").click(startTimer);
$("[name='stop']").click(pauseTimer);
$("[name='reset']").click(resetTimer);
$timer.dblclick(editTimer);
$timer.blur(setElapsed);
$("form").submit(sendTime);
});<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div id="timer">00:00:00</div> </h1> <form action="" method="post" ame="xyz"> <input type="button" name="start" value="Start" class="btn btn-primary mb-2"> <input type="button" name="stop" value="Stop" class="btn btn-primary mb-2"> <input type="submit" name="action" value="Submit" class="btn btn-primary mb-2"> <input type="hidden" name="time" value="00:00:00"> </form>