我想使用performance.now
实现计时器,因为Date.now
取决于用户的时钟(performance.now
不依赖于用户时钟,并且“ Date.now
-way”可能会使计时器崩溃,当用户更改系统时钟时。
我想将计时器存储在localStorage
中。当用户关闭选项卡或浏览器并打开它时,计时器必须重新开始。
重要条件:我想考虑关闭浏览器/标签页的时间。例如,当计时器值为10秒时,用户关闭浏览器。用户打开浏览器10秒后-计时器值应为20秒。
这是我面临的问题。
这是不使用localStorage
的代码:
const timerNode = document.getElementById('timer');
const initialTimestamp = performance.now();
setInterval(() => {
const seconds = getSeconds(initialTimestamp);
timerNode.innerHTML = seconds;
}, 200);
function getSeconds(initialTimestamp) {
return Math.round((performance.now() - initialTimestamp) / 1000);
}
<div id='timer'></div>
是否有任何方法可以使用localStorage
在performance.now
中存储计时器,并在我上面提到的情况下(并遵守条件)恢复计时器?
或者也许还有另一种获取UNIX时间戳的方法,这不取决于系统时钟吗?
要演示Date.now()的问题,请运行此代码并更改系统时间,例如,将日期设置为几天前。您将看到,计时器的值为负。
const timerNode = document.getElementById('timer');
const initialTimestamp = Date.now();
setInterval(() => {
const seconds = getSeconds(initialTimestamp);
timerNode.innerHTML = seconds;
}, 200);
function getSeconds(initialTimestamp) {
return Math.round((Date.now() - initialTimestamp) / 1000);
}
<div id='timer'></div>
答案 0 :(得分:-1)
是的,您可以使用localStorage
来在浏览器会话之间持久化。
您将使用setItem
设置初始时间,并使用getItem
在新的浏览器会话中访问它。当新的浏览器会话开始时,您将检查是否存在先前的初始时间。如果是这样,请使用它。如果没有,请创建它。
var initialTimestamp = localStorage.getItem('initialTimestamp');
// If we previously set an initialTimestamp, convert it from string to number.
if (initialTimestamp) {
initialTimestamp = parseInt(initialTimestamp);
}
// If we never previously set an initial timestamp, create one now.
else {
initialTimestamp = performance.now();
localStorage.setItem('initialTimestamp', initialTimestamp);
}