Javascript定时器-如何防止定时器每次都加速。单击deck?
我正在制作一个记忆卡游戏。class.deck代表一副牌。每次我点击一张卡片,计时器就会加速。如何防止计时器加速Javascript定时器-如何防止定时器每次都加速。单击deck?,javascript,jquery,Javascript,Jquery,我正在制作一个记忆卡游戏。class.deck代表一副牌。每次我点击一张卡片,计时器就会加速。如何防止计时器加速 function startTimer() { $(".deck").on("click", function () { nowTime = setInterval(function () { $timer.text(`${second}`) second = second + 1 }, 100
function startTimer() {
$(".deck").on("click", function () {
nowTime = setInterval(function () {
$timer.text(`${second}`)
second = second + 1
}, 1000);
});
}
在启动新的计时器之前,您需要停止上一个计时器,因为如果不停止,则会出现多个计时器回调函数,所有这些函数都会一个接一个地执行,这会让人产生一种错觉,即您的单个计时器正在加速
function startTimer() {
$(".deck").on("click", function () {
clearInterval(nowTime); // Stop previous timer
nowTime = setInterval(function () {
$timer.text(`${second}`);
second = second + 1;
}, 1000);
});
}
另一种处理方法是只允许在第一次单击按钮时运行单击事件回调:
function startTimer() {
$(".deck").on("click", timer);
function timer() {
nowTime = setInterval(function () {
$timer.text(`${second}`);
second = second + 1;
}, 1000);
$(".deck").off("click", timer); // Remove the click event handler
}
}
function startTimer() {
// Maybe remove old timer? Should happen somewhere in your code.
// Possibly "stopTimer" if you have such a function.
clearInterval(nowTime);
let started = false;
$(".deck").on("click", function () {
if (started) return;
nowTime = setInterval(function () {
$timer.text(`${second}`)
second = second + 1
}, 1000);
started = true;
});
}
您可以启动多个间隔,每次单击一次。你也许应该开始一个。如果要为单击的第一张卡启动它:
function startTimer() {
$(".deck").on("click", timer);
function timer() {
nowTime = setInterval(function () {
$timer.text(`${second}`);
second = second + 1;
}, 1000);
$(".deck").off("click", timer); // Remove the click event handler
}
}
function startTimer() {
// Maybe remove old timer? Should happen somewhere in your code.
// Possibly "stopTimer" if you have such a function.
clearInterval(nowTime);
let started = false;
$(".deck").on("click", function () {
if (started) return;
nowTime = setInterval(function () {
$timer.text(`${second}`)
second = second + 1
}, 1000);
started = true;
});
}
不过,这些代码应该有更多的清理。否则会积累大量死掉的事件侦听器
(此外,我认为永远不应该使用jQuery。)它没有加速。每次单击都会启动一个新计时器,它们都在后台运行。你想做什么?我只想让一个计时器在用户点击一张牌时启动,并在点击更多的牌时让计时器继续正常计数。clearInterval()
调用使started
代码不相关。@ScottMarcus:No.clearInterval
是最后一场“游戏”。虽然它可能属于另一个功能started
存在,因此只有一个按钮启动计时器,否则许多同步计时器的原始问题仍然存在。哦,对不起,您的clearInterval
在单击事件之外。我没注意到,有道理。谢谢实际上,我不推荐第一种方法。它缩短了时间间隔并开始了新的时间间隔,导致时间不准确。@H.B.明白,但它回答了这个问题。而且,延迟可以/应该被减少,因为即使只有一个计时器,1000毫秒也会偶尔导致跳过一秒。为什么会跳过一秒?你能详细说明一下吗?延迟只是计时器“可能”运行的最短时间。这不是确切的保证。如果将其设置为1秒,很可能延迟超过1秒。所以,如果时间是0.95秒,延迟是1.06秒,你会错过1秒,直接跳到2秒。设置较小的延迟(比如200ms)可以减少(但不能消除)这种可能性。这与显示OP正在执行的时间有关。@ScottMarcus:您有这方面的来源吗?我希望回调在经过一段时间后尽快执行,即被推送到事件队列,并在轮到它时立即运行。