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的更多相关文章

  1. xssbypass小记

    简单整理下bypass的一些点 标签外 如果是标签之外 又有htmlspecialchars函数的点 就别想了 在标签外同时能xss但是有长度限制 如果是储存型可以利用多个点 然后构造<scri ...

  2. 冒泡,setinterval,背景图的div绑定事件,匿名函数问题

    1.会冒泡到兄弟元素么? $(function(){ $("#a").click(function(){alert("a")}) $("#b" ...

  3. 你所不知道的setInterval

    在你所不知道的setTimeout记载了下setTimeout相关,此篇则整理了下setInterval:作为拥有广泛应用场景(定时器,轮播图,动画效果,自动滚动等等),而又充满各种不确定性的这set ...

  4. 深入理解定时器系列第一篇——理解setTimeout和setInterval

    × 目录 [1]setTimeout [2]setInterval [3]运行机制[4]作用[5]应用 前面的话 很长时间以来,定时器一直是javascript动画的核心技术.但是,关于定时器,人们通 ...

  5. 前端开发:setTimeout与setInterval 定时器与异步循环数组

    前端开发:setTimeout与setInterval 定时器与异步循环数组 前言: 开通博客园三个月以来,随笔记录了工作中遇到的大大小小的难题,也看过无数篇令人启发的文章,我觉得这样的环境是极好的, ...

  6. javascript函数setInterval和setTimeout的使用区别详解

    setTimeout和setInterval的使用 这两个方法都可以用来实现在一个固定时间段之后去执行JavaScript.不过两者各有各的应用场景. 方 法 实际上,setTimeout和setIn ...

  7. setTimeout和setInterval从入门到精通

    我们在日常web前端开发中,经常需要用到定时器方法. 前端中的定时器方法是浏览器提供的,并不是ECMAScript规范中的.是window对象的方法. 浏览器中的定时器有两种, 一种是每间隔一定时间执 ...

  8. setTimeout和setInterval定时器使用详解测试

    var len=4; while(len--){ var time=setTimeout(function(){ console.log(len); },0); console.log(time); ...

  9. JS中SetTimeOut和SetInterval方法的区别?

    1.setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式. setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭.由 ...

随机推荐

  1. 在虚拟机Ubuntu14.04中设置静态ip后无法上网的问题的解决

    背景:用着实验室代理服务器上网. 原因:网关和DNS没有设置正确 网关和DNS参照 真机cmd在命令窗口使用ipconfig  /all命令查看   虚拟机: sudo gedit /etc/netw ...

  2. golang学习资料必备

    核心资料库 https://github.com/yangwenmai/learning-golang

  3. 【python之路21】用户登陆程序函数

    一.用户登陆函数实例 1.注意:以后写函数时必须在函数第一行后按回车加入“”““”“””两对三引号后回车,此时会自动列出参数值,注释函数的作用.参数的用法和返回值 #!usr/bin/env pyth ...

  4. 如何把一个普通的Eclipse项目改造成Eclipse Plugin项目

    New Project->Plug-in from existing JAR Archive 同时要记得不仅要将你要转换的项目的jar包选上,同时还要将项目依赖的jar包全部选上(要不然会找不到 ...

  5. svn upgrade

    在我们把我们服务器上的svn 版本号升级以后,我们之前的代码再执行svn命令时,会提示需要执行svn upgrade命令把当前的代码由低版本的svn 上迁移到高版本的svn 上去. 直接执行svn u ...

  6. php的模板原理

    下载了开源论坛phpbb的代码,突然对php模板初步了解了一下: php与Html在一起编写真的是很烦人,所以必须要把数据计算以及显示格式分离,这就需要模板来实现了. http://baike.bai ...

  7. python三种导入模块的方法和区别

    方法一: import modname 模块是指一个可以交互使用,或者从另一Python 程序访问的代码段.只要导入了一个模块,就可以引用它的任何公共的函数.类或属性.模块可以通过这种方法来 使用其它 ...

  8. mysql操作手册

    开启日志:https://segmentfault.com/a/1190000003072237 常用词:  Mysql:一种免费的跨平台的数据库系统  E:\mysql:表示是在dos 命令窗口下面 ...

  9. CSS兼容性(IE和Firefox)技巧大全

    CSS对浏览器的兼容性有时让人很头疼,或许当你了解当中的技巧跟原理,就会觉得也不是难事,从网上收集了IE7,6与Fireofx的兼容性处理技巧并整理了一下.对于web2.0的过度,请尽量用xhtml格 ...

  10. (译)Objective-C的动态特性

    这是一篇译文,原文在此,上一篇文章就是受这篇文章启发,这次干脆都翻译过来. 过去的几年中涌现了大量的Objective-C开发者.有些是从动态语言转过来的,比如Ruby或Python,有些是从强类型 ...