26、JavaScript学习笔记——定时器

定时器

1. setInterval()

setInterval()用于指定每隔一段时间执行某些代码。

setInterval()可以接收两个参数,要执行的代码(函数或字符串)和间隔时间(把下一次执行定时代码的任务添加到队列要等待的时间)。

比如,

setInterval(function () {
    console.log("a");
}, 2000);

表示每隔2000毫秒打印一次a。

注意间隔时间的单位是毫秒(ms)。

var time = 2000;
setInterval(function () {
    console.log("a");
}, time);
time = 30000;

在setInterval()后改变time不会改变该定时器的间隔时间。

实际上setInterval()的间隔时间是不准的,因为在原理上,浏览器不关心要执行代码什么时候执行或执行多长时间,只会在一定的时间间隔将任务添加到执行队列。

因此setInterval()适合执行时间短、非阻塞的回调函数。

2. clearInterval()

setInterval()会返回一个循环定时的ID,作为当前setInterval()定时器的唯一标识。

定时器的标识可以用于在某个时间点取消定时。

对于setInterval()而言,取消循环定时需要调用clearInterval(),并将自己的定时ID(标识)传入clearInterval()。

var timer = setInterval(function () {

}, 1000)

clearInterval(timer);
var i = 0;
var timer = setInterval(function () {
    console.log(i ++);
    if(i > 10){
        clearInterval(timer);
    }
}, 1000)

setInterval_clearInterval

5. 练习

计时器,到三分钟停止。

html:

<p>
    minutes:
    <input type="text" value="0">
    seconds:
    <input type="text" value="0">
</p>
<input type="button" value="start">
<input type="button" value="stop">

css:

input[type="text"]{
    font-size: 18px;
    text-align: right;
}
input[type="text"]:focus{
    outline: 2px lightblue solid;
}
input[type="button"]{
    width: 100px;
    height: 30px;
    margin: 30px 0 30px 150px;
}

js:

let sec = 0,
    min = 0;
let start = document.getElementsByTagName("input")[2];
let stop = document.getElementsByTagName("input")[3];
let flag = 0;
start.onclick = function () {
    flag = 0;
    let timer = setInterval(function(){
        
        if(sec > 59){
            sec = 0;
            min ++;
            start.previousElementSibling.firstElementChild.setAttribute("value", min);
        }
        start.previousElementSibling.lastElementChild.setAttribute("value", sec++);
        if(min > 2 || flag){
            clearInterval(timer);
        }
    }, 1000);
}
stop.onclick = function () {
    flag = 1;
}

timer

改进,上面的代码暂停是不及时的,因为点过stop按键之后,把flag置1,定时器还得执行一次才能到下面的if语句。而且本来设个flag变量来停止计时器本来就不是最直接的方法,所以下面将timer变量的定义拿到start点击事件函数的外面,然后在stop点击事件函数中就可以直接使用定时器的标识ID。

此外,之前还有一个bug,就是连续点击start会让计数加速,因为连续点击start会连续创建不同的定时器,在做定时器的作用下,计数速度翻倍。

为了解决这个问题,下面的程序加了一个“开关”,点击一次start会将开关关闭,再次点击start时是不会执行if语句里的创建定时器程序的。

let sec = 0,
    min = 0;
let start = document.getElementsByTagName("input")[2];
let stop = document.getElementsByTagName("input")[3];
let timer;
let key = true;
start.onclick = function () {
    if(key){
        key = false;
        timer = setInterval(function(){
            if(sec > 59){
                sec = 0;
                min ++;
                start.previousElementSibling.firstElementChild.setAttribute("value", min);
            }
            start.previousElementSibling.lastElementChild.setAttribute("value", sec++);
            if(min > 2){
                clearInterval(timer);
            }
        }, 1000);
    }
}
stop.onclick = function () {
    clearInterval(timer);
    key = true;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值