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. SASS在HTML5移动应用开发中的应用方法

    一.什么是SASS SASS是一种CSS的开发工具,提供了许多便利的写法,大大节省了设计者的时间,使得CSS的开发,变得简单和可维护. 本文总结了SASS的主要用法.二.安装和使用 2.1 安装 SA ...

  2. 关于background-image调整大小和位置的方法笔记

    遇到background-image的问题有点多,直接上网搜资料自己整理一下 <!DOCTYPE html> <html lang="en"> <he ...

  3. 二维码识别项目zxing横屏改为竖屏

    第1步: 在AndroidManifest中将CaptureActivity的screenOrientation属性做如下修改: android:screenOrientation="por ...

  4. Centos 下添加开机自启动服务和脚本【转】

    最近刚玩Centos7的系统,跟Centos6还是很多方面有改变的,这里记录一下怎么在Centos7下添加开机自启动脚本和服务的方法. 1.添加开机自启服务 我这里以docker 服务为例,设置如下两 ...

  5. Vue源码探究-数据绑定的实现

    Vue源码探究-数据绑定的实现 本篇代码位于vue/src/core/observer/ 在总结完数据绑定实现的逻辑架构一篇后,已经对Vue的数据观察系统的角色和各自的功能有了比较透彻的了解,这一篇继 ...

  6. NOIP模拟 7.05

    Problem 1 双色球(ball.cpp/c/pas) [题目描述] 机房来了新一届的学弟学妹,邪恶的chenzeyu97发现一位学弟与他同名,于是他当起了善良的学长233 “来来来,学弟,我考你 ...

  7. ThInkPHP加密和解密cookie(登录操作)

    摘自:http://www.thinkphp.cn/code/1794.html 通过加密cookie是网站安全性更高,登录信息不保存在session中在function.php文件在建立两个函数,加 ...

  8. ubuntu上安装字体

    # fc-list # sudo apt-get -y install fontconfig xfonts-utils # sudo cp       XXX.ttf        /usr/shar ...

  9. 微服务开源生态报告 No.6

    「微服务开源生态报告」,汇集各个开源项目近期的社区动态,帮助开发者们更高效的了解到各开源项目的最新进展. 社区动态包括,但不限于:版本发布.人员动态.项目动态和规划.培训和活动. 非常欢迎国内其他微服 ...

  10. JavaScript--数组与伪数组(特殊对象)的区别

    一.数组与伪数组的区别例子: 从原型链上解析: <!DOCTYPE html> <html lang="en"> <head> <meta ...