settTimeout vs setInterval
setTimeout:过一段固定的时间后,将代码提交到代码队列中排队。
setInterval:每隔一段固定的时间,执行一次代码。
他们两都接受两个参数,第一个参数是字符串或者函数,第二个参数是设定的时间值。第一个参数是字符串时有时会出错,因此建议使用函数作为第一个参数。
举个例子:有10个div,设置了宽度和高度,现在需要第一个div改变成蓝色后,第二个div改变为蓝色,...,最后一个div改变为蓝色
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
一、setTimeout
如果想要使用setTimeout实现上面的功能,那么可以有两种方式:
1)放在for循环中
for(var i=0;i<10;i++){
(function(i){
setTimeout(function(){
div[i].style.backgroundColor="blue";
},500);//这里都用了500,也就是说500秒后将所有的div变色都同时提交到代码队列,这样是看不到一个一个变颜色的,所以时间必须错开。
})(i);
}
for(var i=0;i<10;i++){
(function(i){
setTimeout(function(){
div[i].style.backgroundColor="blue";
},500*(i+1));//这样就是每隔500就提交一个,所有div一个一个变色
})(i);
}
现在又有一个需求,要让最后一个div变成蓝色后隔500毫秒又变回白色
for(var i=0;i<10;i++){
(function(i){
setTimeout(function(){
div[i].style.backgroundColor="blue";
if(i==div.length-1){
timer=setTimeout(function(){
div[i].style.backgroundColor="#fff";
},500);//这里的500是基于外面的500*(i+1)的,如果把if语句放在外面,则程序不一样
}
},500*(i+1));
})(i);
}
for(var i=0;i<10;i++){
(function(i){
timer=setTimeout(function(){
div[i].style.backgroundColor="blue";
},500*(i+1));
if(i==div.length-1){
setTimeout(function(){
div[i].style.backgroundColor="#fff";
},500*(i+2));//因为把前面第i个提交是等待了500*(i+1)毫秒,再隔500毫秒提交的话,就是500*(i+1)+500
}
})(i);
}
现在如果增加了一个按钮,按下按钮就要取消填色事件。如果点击事件直接写出clearTimeout(timer)的话,就只会取消最后一个div的填色事件。因为在for循环里,已经为所有的timer赋值了,在for循环外面再取消的话就会直接取消最后一次添加的timer事件。如果想要答道取消的效果,那么就不能用for循环。
2)不用for循环
var i=0;
function f(){
if(i<div.length){
div[i].style.backgroundColor="blue";
i++;
timer=setTimeout(f,500);//timer不能加在函数外面的那个语句上
}else{
div[i-1].style.backgroundColor="#fff";
}
}
setTimeout(f,500);
这样也可以达到上述效果,并且这里按下按钮可以随时终止变色事件。
btn.onclick=function(){clearTimeout(timer);}
二、setInterval
setInterval函数是每隔多长时间调用一次,因此不需要与for循环一起用。直接采用第二种方式就可以了
var i=0;
timer=setInterval(function(){
if(i<div.length){
div[i].style.backgroundColor="blue";
i++;
}else{
clearInterval(timer);
div[i-1].style.backgroundColor="#fff";
}
},500);
var btn1=document.getElementById("btn1");
btn1.onclick=function(){
clearTimeout(timer);
}
三、补充一点
setTimeout中的函数是不能带参数的,但是如果要传入一个参数怎么办呢,比如上面一直都是蓝色,我想要自己改变颜色,这样就需要再写一个函数,然后这个函数返回一个无参函数,蓝色的部分都需要改。另外如果传入的函数为ff(),那么这个函数ff就会立即执行,不会有延时的效果。
var i=0;
setTimeout(ff('red'),500);
function f(color){
if(i<div.length){
div[i].style.backgroundColor=color;
timer=setTimeout(ff('red'),500);
i++;
}else{
div[i-1].style.backgroundColor="#fff";
}
}
function ff(color){
return function(){
f(color);
}
}
settTimeout vs setInterval的更多相关文章
- xssbypass小记
简单整理下bypass的一些点 标签外 如果是标签之外 又有htmlspecialchars函数的点 就别想了 在标签外同时能xss但是有长度限制 如果是储存型可以利用多个点 然后构造<scri ...
- 冒泡,setinterval,背景图的div绑定事件,匿名函数问题
1.会冒泡到兄弟元素么? $(function(){ $("#a").click(function(){alert("a")}) $("#b" ...
- 你所不知道的setInterval
在你所不知道的setTimeout记载了下setTimeout相关,此篇则整理了下setInterval:作为拥有广泛应用场景(定时器,轮播图,动画效果,自动滚动等等),而又充满各种不确定性的这set ...
- 深入理解定时器系列第一篇——理解setTimeout和setInterval
× 目录 [1]setTimeout [2]setInterval [3]运行机制[4]作用[5]应用 前面的话 很长时间以来,定时器一直是javascript动画的核心技术.但是,关于定时器,人们通 ...
- 前端开发:setTimeout与setInterval 定时器与异步循环数组
前端开发:setTimeout与setInterval 定时器与异步循环数组 前言: 开通博客园三个月以来,随笔记录了工作中遇到的大大小小的难题,也看过无数篇令人启发的文章,我觉得这样的环境是极好的, ...
- javascript函数setInterval和setTimeout的使用区别详解
setTimeout和setInterval的使用 这两个方法都可以用来实现在一个固定时间段之后去执行JavaScript.不过两者各有各的应用场景. 方 法 实际上,setTimeout和setIn ...
- setTimeout和setInterval从入门到精通
我们在日常web前端开发中,经常需要用到定时器方法. 前端中的定时器方法是浏览器提供的,并不是ECMAScript规范中的.是window对象的方法. 浏览器中的定时器有两种, 一种是每间隔一定时间执 ...
- setTimeout和setInterval定时器使用详解测试
var len=4; while(len--){ var time=setTimeout(function(){ console.log(len); },0); console.log(time); ...
- JS中SetTimeOut和SetInterval方法的区别?
1.setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式. setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭.由 ...
随机推荐
- 2019阿里云开年Hi购季基础云产品分会场全攻略!
2019阿里云云上Hi购季活动已经于2月25日正式开启,从已开放的活动页面来看,活动分为三个阶段: 2月25日-3月04日的活动报名阶段.3月04日-3月16日的新购满返+5折抢购阶段.3月16日-3 ...
- 一位AI研究员+区块链创业者的终极展望:AI DAO将统治世界
一位AI研究员+区块链创业者的终极展望:AI DAO将统治世界 [日期:2017-01-09] 来源:infoq.com 作者:杨赛 [字体:大 中 小] Trent McConaghy是一位资深的 ...
- SCAN listener and Node listener – How does it work
http://www.mydbspace.com/? p=324 Single Client Access Name (SCAN) is new feature of oracle 11gR2 gri ...
- springboot自定义错误页面(转)
方法一:Spring Boot 将所有的错误默认映射到/error, 实现ErrorController @Controller @RequestMapping(value = "error ...
- adb安装apk包时提示:device unauthorized
adb install apk时提示device unauthorized,手机上还没出现usb是否允许调试的询问弹框: 解决方法: 1.cmd输入:adb kill-server,点击回车键 2.c ...
- 工程没有生成lib文件,只生成了dll文件
解决办法: 在工程上右键 -> 添加 -> 新建项 -> 选"模块定义文件(.def)" -> 随便填写个名字 -> 添加 重新编译编译就可生成.li ...
- 【python小随笔】进程池 multiprocessing.Pool的简单实现与踩过的坑
#导入进程模块 import multiprocessing #创建进程池 坑:一定要在循环外面创建进程池,不然会一直创建 pool = multiprocessing.Pool(30) for Si ...
- python 导入整个模块
- 解决VS+Qt不生成moc文件问题
使用VS的Qt插件进行Qt开发时,有时候会遇到不能生成moc文件的问题. 1.在工程中可以看到这个Generated files目录下是有一个看似moc文件的文件,双击打开的话: 如果能正常打开,文件 ...
- 【Leetcode栈】有效的括号(20)
题目 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 1,左括号必须用相同类型的右括号闭合. 2,左括号必须以正确的顺序闭合. 注意 ...