1.定时器
定义:当我们需要隔一段时间,再执行一段代码。或者每隔一段时间,执行一段代码。我们可以使用定时器。
使用场景:例如网站轮播图的自动滚动。广告延迟弹出的某些操作
2.定时器-setInterval
定时器-setInterval基本定义
- setInterval
间隔型定时器:每隔一段时间执行一段代码。
注意:代码一般会重复执行 - 语法
setInterval(函数,时间间隔);
eg:
setInterval(fn,20);指的是每隔20 毫秒执行一段函数
时间间隔的单位 : 是毫秒(ms)1s = 1000ms - 返回值
setInterval(重复执行的代码,时间间隔);这段代码的返回值是分配定时器一个独有的编号。这个编号跟关闭定时器有关。当你开启很多定时器的时候,你想关闭哪一个定时器,就需要知道对应的编号然后关闭。就是每开启一个定时器,会给这个定时器贴一个编号,编号是数字类型的,会由这段代码的返回值传递出编码。
使用举例1—无参函数
<script>
//方式一:函数为匿名函数
setInterval(function () {
console.log(1);
},1000);
//方式二:有名函数-part1
function fn() {
console.log(2);
}
setInterval(fn,1000);
//方式二:有名函数-part2
function go() {
console.log(3);
}
setInterval("go()",1000);
</script>
使用举例2—有参函数
<script>
//方式一:有名函数的传参
function fn(a,b) {
console.log(a,b);
}
setInterval("fn('c','d')",1000);
//方式二:匿名函数的传参
setInterval(function(a,b,c){
console.log(a,b,c);
},1000,"a","b","c");
</script>
注意:
<script>
//以下代码只是开了一个定时器,会在1s之后执行这个函数。
setInterval(function(){
console.log(1);
},1000);
console.log(222);
console.log(333);
</script>
以下是代码执行结果:先打印222和333。之后1s后打印1.
3.setInterval—轮播图
<!DOCTYPE html>
<html >
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
#box{
width:400px;
height:400px;
border:2px solid black;
background: red;
}
</style>
</head>
<body>
<div id="box"></div>
<script>
data=["red","blue","yellow","pink"];
var box=document.getElementById("box");
var num=0;
var L=data.length;
setInterval(function () {
num++;
//L%num的结果永远会小于L,并且是0,1,2,····L-1这样循环的。
num%=L;
box.style.backgroundColor=data[num];
},1000);
</script>
</body>
</html>
自动播放效果,可以点击查看。因为codepen不方便放图片,就用颜色代替
4.setInterval—轮播图的停止
css样式我就删除了,直接给出js和html。需要全部代码的可以从链接下面去看。点击链接中的css,html,js都可以查看对应的代码。
方式一:控制步长来停止轮播图的运动,但是定时器还没关(听语言描述可能有些模糊,直接上代码)
通过步长来控制停止轮播图的运动,点击查看效果
<body>
<div id="box"></div>
<button id="stop">停止播放</button>
<script>
data=["red","blue","yellow","pink"];
var box=document.getElementById("box");
var stop=document.getElementById("stop");
var num=0;
var step=1;
var L=data.length;
setInterval(function () {
//通过step来控制颜色的转化。
num+=step;
num%=L;
box.style.backgroundColor=data[num];
//可以从 console.log(1)看出定时器没关闭,就算停止轮播了,依旧不停的打印1.
console.log(1);
},1000);
stop.onclick=function () {
//让step为0,图片就停止在那个地方。但是定时器没关。
step=0;
};
</script>
</body>
</html>
方式二:通过一个变量来控制定时器中函数的执行,但是定时器还是没关。
通过onoff变量来控制定时器内函数的执行
<body>
<div id="box"></div>
<button id="stop">停止播放</button>
<script>
data=["red","blue","yellow","pink"];
var box=document.getElementById("box");
var stop=document.getElementById("stop");
var num=0;
//默认为true。
var onoff=true;
var L=data.length;
setInterval(function () {
//button点击之后,onoff为false,则无法执行
if(onoff) {
num++;
num %= L;
box.style.backgroundColor = data[num];
}
console.log(1);
},1000);
stop.onclick=function () {
//点击之后为false。
onoff=false;
};
</script>
</body>
</html>
方式三:通过关闭定时器来停止轮播图的运动。
此方法简洁,不需要添加额外的变量。但是有时候也需要以上两种方法。
直接关闭定时器,点击css,html,js可以查看对应代码
<body>
<div id="box"></div>
<button id="stop">停止播放</button>
<script>
data=["red","blue","yellow","pink"];
var box=document.getElementById("box");
var stop=document.getElementById("stop");
var num=0;
var L=data.length;
//setInterval()方法返回的是定时器的编号。这个编号是独有的。
var timer=setInterval(function () {
num++;
num %= L;
box.style.backgroundColor = data[num];
console.log(1);
},1000);
stop.onclick=function () {
//clearInterval(),通过传入定时器的编号来。关闭定时器
clearInterval(timer);
};
</script>
</body>
</html>
5.setInterval—轮播图的停止和开始
方式一:清除定时器,再开启定时器。
清除定时器,再开启定时器。注意:重新开启定时器的时候也要清除前一个定时器
<!DOCTYPE html>
<html >
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
#box{
width:400px;
height:400px;
border:2px solid black;
background: red;
}
button{
width: 100px;
line-height: 50px;
background: cornflowerblue;
color: #fff;
font-size: 20px;
border:none;
margin-top: 10px;
outline: none;
}
</style>
</head>
<body>
<div id="box"></div>
<button id="stop">停止播放</button>
<button id="star">开始播放</button>
<script>
data=["red","blue","yellow","pink"];
var box=document.getElementById("box");
var stop=document.getElementById("stop");
var star=document.getElementById("star");
var num=0;
var L=data.length;
function move() {
num++;
num %= L;
box.style.backgroundColor = data[num];
};
var timer=setInterval(move,1000);
stop.onclick=function () {
//clearInterval(),通过传入定时器的编号来。关闭定时器
clearInterval(timer);
};
star.onclick=function () {
//每次开启定时器的时候,先清除前一个定时器。因为当用户重复点击开始按钮,就会打开多个定时器。
//所以,每次打开定时器,先清除前一个。
clearInterval(timer);
timer=setInterval(move,1000);
}
</script>
</body>
</html>
方式二:使用变量控制定时器的开始与停止
使用step步长控制定时器的开始与停止
<div id="box"></div>
<button id="stop">停止播放</button>
<button id="star">开始播放</button>
<script>
data=["red","blue","yellow","pink"];
var box=document.getElementById("box");
var stop=document.getElementById("stop");
var star=document.getElementById("star");
var num=0;
var L=data.length;
var step=1;
function move() {
num+=step;
num %= L;
box.style.backgroundColor = data[num];
};
setInterval(move,1000);
stop.onclick=function () {
//停止按钮,step=0
step=0;
};
star.onclick=function () {
//开始按钮,step=1
step=1;
}
</script>
方式三:使用变量重新开始定时器
使用变量重新开始定时器
<body>
<div id="box"></div>
<button id="stop">停止播放</button>
<button id="star">开始播放</button>
<script>
data=["red","blue","yellow","pink"];
var box=document.getElementById("box");
var stop=document.getElementById("stop");
var star=document.getElementById("star");
var num=0;
var L=data.length;
var isPlay=true;
function move() {
num++;
num %= L;
box.style.backgroundColor = data[num];
};
var timer=setInterval(move,1000);
stop.onclick=function () {
clearInterval(timer);
isPlay=false;
};
star.onclick=function () {
if(!isPlay){//没有在播放就开始定时器
timer=setInterval(move,1000);
}
isPlay=true;//改变状态
}
</script>
</body>
6.定时器-setTimeout
定时器-setTimeout基本定义
-
延迟型定时器
隔一段时间执行一段代码(执行一次)
-
语法:
setTimeout(函数,时间间隔)
比如setTimeout(fn,20)隔(等待)20 毫秒执行一段函数
时间间隔的单位 :是毫秒(ms)
1s = 1000ms - 返回值:定时器唯一的编号
- 注意:虽然只执行一次,就不执行了。但是还是要关闭定时器,不然会消耗性能。
1.举例说明
点击查看以下代码效果
<script>
//隔一秒页面会弹出Hello。
var timer = setTimeout( function(){
alert("Hello");
},1000 );
//点击页面任何一个位置关闭定时器。
document.onclick = function(){
clearTimeout( timer );
}
</script>
2.使用递归,让setTimeout定时器有setInterval的效果
点击链接查看以下代码效果!!!
<script>
var timer = 0;
function fn(){
timer = setTimeout( function(){
console.log(1);
//继续调用fn,则在控制台还会打印1。
fn();
},1000 )
}
fn();
document.onclick = function(){
clearTimeout( timer )
}
</script>