我正在尝试使用Javascript中的setInterval和clearInterval方法,但我遇到了问题。我想要做的就是名义上每个" x"大多数时间都是秒,但是在一定的时间间隔内,运行频率更高。我已经附上了一些代码,这些代码是迄今为止我所得到的不完整的代码,这是一个简单的概念证明 - 在这个例子中,每隔10秒显示分钟,否则在30和之间40分钟(作为虚拟值,看我是否能让它工作),显示每1秒更新一次。但我已经意识到我无法检查setInterval是否仍在运行以及如何重新启动它(作为" myVar"变量)。
<!DOCTYPE html>
<html>
<body>
<p id="demo">Just testing...</p>
<script>
var d = new Date();
myVar = setInterval( informUser, 10000);
function informUser()
{
if ( d.getMinutes()>30 && d.getMinutes()<40 ) // every second
{
clearInterval(myVar);
mvVar = setInterval( informUser, 1000);
document.getElementById("demo").innerHTML = d.getMinutes();
}
else // else 10 seconds
{
document.getElementById("demo").innerHTML = d.getMinutes();
}
}
</script>
</body>
</html>
正如我所说,当我遇到一堵砖墙时代码非常不完整!一旦我有了工作,我可以让它变得更复杂一些。 编辑:
感谢您对语法的评论,但这不是整个问题。 此时代码执行的操作是每隔10秒将分钟输出到屏幕,直到达到小时的31分钟。然后它停止计时器,并以1秒的间隔启动它。经过9分钟后,代码停止,因为计时器尚未启动。
我喜欢做的是&#34;否则//其他10秒&#34;看看myVar是否为null的部分;如果是,则重启计时器10秒钟。
答案 0 :(得分:1)
Date
对象正在函数外部创建,因此保持不变。
else
块中未更新定时器持续时间。
在每种模式下重新创建间隔定时器可能会因漂移而产生一些奇怪的效果。相反,创建一个具有超时的定时器,该超时是两个所需间隔的最大公约数,计算其触发次数,并将逻辑基于该计数。
interval = setInterval( informUser, 1000);
intervalCount = 0;
function informUser() {
var minutes = Date.now().getMinutes();
intervalCount++;
if(minutes > 30 && minutes < 40) {
intervalCount = 0;
document.getElementById("demo").innerHTML = minutes;
}
else if (intervalCount >= 10) {
intervalCount = 0;
document.getElementById("demo").innerHTML = minutes;
}
}
答案 1 :(得分:0)
有几件事让你的问题不清楚。
&#34;看看setInterval是否仍在运行&#34;。基本上,它一直在运行,唯一一次停止它就是clearInterval,然后你再次启动它。
同样,myVar永远不会为空。
在31到39的时间段内,你真的没有使用&#34;间隔&#34; - 您正在清除它并每次重新启动它。
这个怎么样:
var d = new Date();
currInterval = 10000;
myVar = setInterval( informUser, currInterval);
function informUser()
{
document.getElementById("demo").innerHTML = d.getMinutes();
intervalShouldBe = 10000;
if ( d.getMinutes()>30 && d.getMinutes()<40 )
intervalShouldBe = 1000;
// stop and restart only when interval needs to change
if(currInterval != intervalShouldBe) {
clearInterval(myVar);
myVar = null;
myVar = setInterval( informUser, intervalShouldBe);
currInterval = intervalShouldBe;
}
}