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() 被调用或窗口被关闭.由 ...
随机推荐
- angular.module()创建、获取、注册angular中的模块
// 传递参数不止一个,代表新建模块;空数组代表该模块不依赖其他模块 var createModule = angular.module("myModule", []); // 只 ...
- JS---案例:手风琴 (利用封装好的动画函数)
案例:手风琴 封装好的动画函数在common.js里面 //function getStyle(element, attr) {...} //function animate( ...
- Android平台本地(离线)打包指南 - Android Studio
预备环境 AndroidStudio开发环境,要求安装Android4.0或以上(API 14)SDK. 下载HBuilder离线打包Android版SDK(5+ SDK下载). 离线打包SDK目录说 ...
- Linux的概述与分类
1.Linux的概述 Linux是基于Unix的开源免费的操作系统,由于系统的稳定性和安全性几乎成为程序代码运行的最佳系统环境.Linux是由Linus Torvalds(林纳斯·托瓦兹)起初开发的, ...
- TyvjP1266 费解的开关
P1266 费解的开关 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 你玩过“拉灯”游戏吗?25盏灯排成一个5x5的方形.每一个灯都有一个开关,游戏 ...
- idea 项目热部署设置
1.引入pom.xml() <!-- 热部署(必须) --> <dependency> <groupId>org.springframework.boot</ ...
- awss3
import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.io ...
- DCOJ5117 set
题目描述 给定一个数集 A,要求构造一个数集 B,满足: • 对于 A 集合中任意的数 x,x 属于 B,即 A ⊆ B: • 对于 B 集合中任意的数 a, b,(a + b) mod p 属于 B ...
- QT,QLabel添加超链接
1.方法1:使用信号槽绑定方式 //设置超链接并绑定信号槽QLabel *linkLabel = new QLabel(); linkLabel->setText("<a hre ...
- 【JZOJ4848】【GDOI2017模拟11.3】永恒的契约
题目描述 宅邸迅速的燃烧着,必须带贝蒂走出禁书库!凭着感觉,又一次直接找到禁书库的门. "你,是那个人嘛?"400年了,当初圣域建立结界时没有进入圣域,被伤了心的人工精灵贝蒂,与强 ...