javascript - 如何在浏览器刷新时保存计数计时器?
问题描述
我是堆栈溢出和 javascript 的新手。我的第一个任务是创建一个倒数计时器。我的代码有效,但如果刷新浏览器,我会失去计时器位置。我一直在阅读有关使用本地存储来保存位置的文章,但我不确定如何将其添加到我当前的代码中。有人愿意为此提供帮助吗?这就是我当前的 javascript 在我的 html 文件中的样子。
window.onload = () => {
let day = 0;
let hour = 0;
let minute = 0;
let seconds = 0;
let totalSeconds = 0;
let intervalId = null;
function startTimer() {
++totalSeconds;
day = Math.floor(totalSeconds/86400);
hour = Math.floor(totalSeconds /3600);
minute = Math.floor((totalSeconds - hour*3600)/60);
seconds = totalSeconds - (hour*3600 + minute*60);
document.getElementById("day").innerHTML = day;
document.getElementById("hour").innerHTML = hour;
document.getElementById("minute").innerHTML = minute;
document.getElementById("seconds").innerHTML = seconds;
}
document.getElementById('start-btn').addEventListener('click', () => {
intervalId = setInterval(startTimer, 1000);
})
document.getElementById('stop-btn').addEventListener('click', () => {
if (intervalId)
clearInterval(intervalId);
});
document.getElementById('reset-btn').addEventListener('click', () => {
totalSeconds = 0;
document.getElementById("day").innerHTML = '0';
document.getElementById("hour").innerHTML = '0';
document.getElementById("minute").innerHTML = '0';
document.getElementById("seconds").innerHTML = '0';
});
}
解决方案
首先,不要存储经过的秒数,而应该存储计时器开始的时间,然后计算经过的秒数。
在这里,如果"start-timestamp"
本地存储中存在for 的值,则将其startTimestamp
设置为它并激活计时器。
当计时器启动时,startTimestamp
设置为当前时间并存储在本地存储中,当它停止时,"start-timestamp"
从本地存储中删除。
let day = 0;
let hour = 0;
let minute = 0;
let seconds = 0;
let startTimestamp = 0;
let intervalId = null;
function updateTimer() {
let totalSeconds = (Date.now() - startTimestamp) / 1000;
day = Math.floor(totalSeconds/86400);
hour = Math.floor(totalSeconds /3600);
minute = Math.floor((totalSeconds - hour*3600)/60);
seconds = totalSeconds - (hour*3600 + minute*60);
document.getElementById("day").innerHTML = day;
document.getElementById("hour").innerHTML = hour;
document.getElementById("minute").innerHTML = minute;
document.getElementById("seconds").innerHTML = seconds;
}
{
const _startTimestamp = localStorage.getItem("start-timestamp");
if (_startTimestamp) {
startTimestamp = Number(_startTimestamp);
intervalId = setInterval(updateTimer, 1000);
}
}
document.getElementById('start-btn').addEventListener('click', () => {
if (!intervalId) {
startTimestamp = Date.now();
localStorage.setItem("start-timestamp", startTimestamp);
intervalId = setInterval(updateTimer, 1000);
}
})
document.getElementById('stop-btn').addEventListener('click', () => {
if (intervalId) {
clearInterval(intervalId);
localStorage.removeItem("start-timestamp");
}
});
document.getElementById('reset-btn').addEventListener('click', () => {
totalSeconds = 0;
document.getElementById("day").innerHTML = '0';
document.getElementById("hour").innerHTML = '0';
document.getElementById("minute").innerHTML = '0';
document.getElementById("seconds").innerHTML = '0';
});
推荐阅读
- python - 在没有 nodata 值的folium 地图上显示卫星数据
- android - 如何使用 SwipeRefreshLayout 刷新 RecyclerView
- php - 在 EasyAdmin 2.3 中将 json_array 元素显示为单独的字段
- c++ - Arduino C++ for 循环提前退出?
- java - 并行化数千次下载的最佳方式
- php - 如何根据群组组成(例如,2 名护士、1 名外科医生、3 名物理助理)从数据库中随机组成一个组?
- vue.js - 如何缩短 Vue 中的验证时间?
- python - 使用 keras 或 tensorflow v2 加载由 tensorflow v1 保存的模型
- cmake - 热门我在 CMake 中链接 MPFR 吗?
- c# - 用c#绘制两条线以连接2个情侣按钮