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() 被调用或窗口被关闭.由 ...
随机推荐
- 极简bootstrap file 美化样式(无需第三方插件)
原本的file上传表单非常的丑,但是又不想使用第三方插件,Bootstrap也没有相关的美化,于是用纯CSS完成,美化,JS实现功能,连BootStrap都不需要,十分简单 1.给原版丑表单隐藏了di ...
- JS 获取浏览器窗口大小 获取屏幕,浏览器,网页高度宽度
网页可见区域宽:document.body.clientWidth 网页可见区域高:document.body.clientHeight 网页可见区域宽:document.body.offsetWid ...
- MaxCompute问答整理之7月
本文是基于本人对MaxCompute产品的学习进度,再结合开发者社区里面的一些问题,进而整理成文.希望对大家有所帮助. 问题一.DataWorks V2.0简单模式和标准模式的区别?公司数仓的数据上云 ...
- JavaScript基本的使用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- CI框架--浅谈前后台区分
谈到CI框架,这是我第二个用到的框架,初步使用过后,眼前一亮.CI框架上手简单.模式明确.适合新手学习框架时入手. 下面给大家讲讲CI框架区分前后台文件的具体做法: 首先在application文件夹 ...
- using namespace std 和 include 的区别
using namespace std; int main() { std::string dd = "ddd";//会报错namespace "std" h ...
- 【JZOJ4161】于神之怒 莫比乌斯反演
任务 答案mod 1e9+7. 解法 容易写出反演: Ans=∑T=1nTk∗∑i=1⌊nT⌋⌊niT⌋⌊miT⌋μ(i) ∑⌊nT⌋i=1⌊niT⌋⌊miT⌋μ(i)这个因式显然是经典的分块处理: ...
- 如何在Data Lake Analytics中使用临时表
前言 Data Lake Analytics (后文简称DLA)是阿里云重磅推出的一款用于大数据分析的产品,可以对存储在OSS,OTS上的数据进行查询分析.相较于传统的数据分析产品,用户无需将数据重新 ...
- iOS 开发该选择Blocks还是Delegates
http://www.cocoachina.com/ios/20150925/13525.html 前文:网络上找了很多关于delegation和block的使用场景,发现没有很满意的解释,后来无意中 ...
- 2019-4-7-VisualStudio-解决方案筛选器-slnf-文件
title author date CreateTime categories VisualStudio 解决方案筛选器 slnf 文件 lindexi 2019-04-07 11:34:59 +08 ...