JavaScript中的定时器之Item23的合理使用


Posted in Javascript onOctober 30, 2015

在javascritp中,有两个关于定时器的专用函数,它们是: 

1.倒计定时器:timename=setTimeout("function();",delaytime); 
2.循环定时器:timename=setInterval("function();",delaytime); 

1、定时器概述

window对象提供了两个方法来实现定时器的效果,分别是window.setTimeout()和window.setInterval。其中前者可以使一段代码在指定时间后运行;而后者则可以使一段代码每过指定时间就运行一次。它们的原型如下:

window.setTimeout(expression,milliseconds); 
window.setInterval(expression,milliseconds);

其中,expression可以是用引号括起来的一段代码,也可以是一个函数名,到了指定的时间,系统便会自动调用该函数,当使用函数名作为调用句柄时, 不能带有任何参数;而使用字符串时,则可以在其中写入要传递的参数。两个方法的第二个参数是milliseconds,表示延时或者重复执行的毫秒数。下 面分别介绍两种方法。

使用SetInterval和设定延时函数setTimeout 很类似。setTimeout 运用在延迟一段时间,再进行某项操作。

setTimeout("function",time) 设置一个超时对象
setInterval("function",time) 设置一个超时对象
setInterval为自动重复,setTimeout不会重复。

clearTimeout(对象) 清除已设置的setTimeout对象
clearInterval(对象) 清除已设置的setInterval对象
使用定时器实现JavaScript的延期执行或重复执行 .

2、具体使用

1.window.setTimeout方法

该方法可以延时执行一个函数,例如:

function hello(){ 
  alert("hello"); 
} 
window.setTimeout(hello,5000);

这段代码将使得页面打开5秒钟后显示对话框“hello”。其中最后一句也可以写为:

window.setTimeout("hello()",5000);

读者可以体会它们的差别,在window.setInterval方法中也有这样的性质。

如果在延时期限到达之前取消延执行,可以使用window.clearTimeout(timeoutId)方法,该方法接收一个id,表示一个定时器。这个id是由setTimeout方法返回的,例如:

function hello(){ 
   alert("hello"); 
} 
var id=window.setTimeout(hello,5000); 
document.onclick=function(){ 
   window.clearTimeout(id); 
}

这样,如果要取消显示,只需单击页面任何一部分,就执行了window.clearTimeout方法,使得超时操作被取消。

2.window.setInterval方法

该方法使得一个函数每隔固定时间被调用一次,是一个很常用的方法。如果想要取消定时执行,和clearTimeout方法类似,可以调用 window.clearInterval方法。clearInterval方法同样接收一个setInterval方法返回的值作为参数。例如:

//定义一个反复执行的调用 
var id=window.setInterval("somefunction",10000); 
//取消定时执行 
window.clearInterval(id);

3. Demo小练习

上面的代码仅用于说明怎样取消一个定时执行。实际上在很多场合都需要用到setInterval方法,下面将设计一个秒表,来介绍setInterval 函数的用途:该秒表将包括两个按钮和一个用于显示时间的文本框。当单击开始按钮时开始计时,最小单位为0.01秒,此时再次单击按钮则停止计时,文本框显 示经过的时间。另外一个按钮用于将当前时间清零。其实现代码如下:

<html> 
<head> 
<title> New Document </title> 
</head> 
<body> 
  <form action="somepage.asp"> 
    <input type="text" value="0" name="txt1"/> 
    <input type="button" value="开始" name="btnStart"/> 
    <input type="button" value="重置" name="btnReset"/> 
  </form> 
</body> 
</html> 
<script language="JavaScript" type="text/javascript"> 
<!-- 
//获取表单中的表单域 
var txt=document.forms[0].elements["txt1"]; 
var btnStart=document.forms[0].elements["btnStart"]; 
var btnReset=document.forms[0].elements["btnReset"] 
//定义定时器的id 
var id; 
//每10毫秒该值增加1 
var seed=0; 
btnStart.onclick=function(){ 
   //根据按钮文本来判断当前操作 
   if(this.value=="开始"){ 
       //使按钮文本变为停止 
       this.value="停止"; 
       //使重置按钮不可用 
       btnReset.disabled=true; 
       //设置定时器,每0.01s跳一次 
       id=window.setInterval(tip,10); 
   }else{ 
       //使按钮文本变为开始 
       this.value="开始"; 
       //使重置按钮可用 
       btnReset.disabled=false; 
       //取消定时 
       window.clearInterval(id); 
   } 
} 
//重置按钮 
btnReset.onclick=function(){ 
   seed=0; 
} 
//让秒表跳一格 
function tip(){ 
   seed++; 
   txt.value=seed/100; 
} 
//--> 
</script>

3. 给定时器调用传递参数

无论是window.setTimeout还是window.setInterval,在使用函数名作为调用句柄时都不能带参数,而在许多场合必须要带参数,这就需要想方法解决。例如对于函数hello(_name),它用于针对用户名显示欢迎信息:

var userName="jack"; 
//根据用户名显示欢迎信息 
function hello(_name){ 
   alert("hello,"+_name); 
}

这时,如果企图使用以下语句来使hello函数延迟3秒执行是不可行的:

window.setTimeout(hello(userName),3000);

这将使hello函数立即执行,并将返回值作为调用句柄传递给setTimeout函数,其结果并不是程序需要的。而使用字符串形式可以达到想要的结果:

window.setTimeout("hello(userName)",3000);

这里的字符串是一段JavaScript代码,其中的userName表示的是变量。但这种写法不够直观,而且有些场合必须使用函数名,下面用一个小技巧来实现带参数函数的调用:

var userName="jack"; 
//根据用户名显示欢迎信息 
function hello(_name){ 
    alert("hello,"+_name); 
} 
//创建一个函数,用于返回一个无参数函数 
function _hello(_name){ 
    return function(){ 
       hello(_name); 
    } 
} 
window.setTimeout(_hello(userName),3000); 
</script>

这里定义了一个函数_hello,用于接收一个参数,并返回一个不带参数的函数,在这个函数内部使用了外部函数的参数,从而对其调用,不需要使用参数。在 window.setTimeout函数中,使用_hello(userName)来返回一个不带参数的函数句柄,从而实现了参数传递的功能。

4. 正确认识定时器的“定时”功能

首先看一段代码

function display(){
  alert(hello);
}
setTimeout("display()", 3000);
alert("你首先看到的是我!")

代码先输出哪个?答案在程序中很明显。为什么呢?

初学者可能对Javascript的定时器有误解,认为它们是线程,其实Javascript是运行于单线程中的,而定时器仅仅是计划在未来的某个时间执行,而具体的执行时间是不能保证的,因为在页面的生命周期中,不同的时间可能有其它代码在控制Javascript的里进程。浏览器只是负责进行排序,指派某个代码在某个时间点运行。

下面说下Javascript线程,下图表示javascript进程时间线。

JavaScript中的定时器之Item23的合理使用

除了javascript执行进程外,还有一个需要在进程下一次空闲时间执行的代码队列,随着页面在其生命周期内的推移,代码会按照执行顺序添加到对列中,例如:当一个按钮被按下时,它的事件处理就会添加到队列中,并在下一个可能的时间内执行。

定时器对队列的工作方式是,当特定的时间过去后,将代码插入,注意添加到队列并不意味着它会马上执行,而只能说它会尽快执行,设定一个250ms后执行的定时器,不代表250ms后它会马上执行,它只会表示在250ms后被加入到队列中,如果这个时间点队列是空闲的,那么这段代码就会被执行。

请看以下代码:

var btn = document.getElementById("mybtn");
  btn.onclick = function () {
    setTimeout(function () {
      document.getElementById("message").nodeName = "mymessage";
      //其它代码
    }, 250);
  }

对于定时器最要注意的是:指定的时间间隔表示何时将定时器的代码添加到队列中,而不是何时执行代码。关于这个onclick事伯处理的进程时间线请看下图:

JavaScript中的定时器之Item23的合理使用

Javascript 相关文章推荐
javascript 控制弹出窗口
Apr 10 Javascript
js的闭包的一个示例说明
Nov 18 Javascript
JavaScript动态调整TextArea高度的代码
Dec 28 Javascript
JavaScript数值数组排序示例分享
May 27 Javascript
js实现仿QQ秀换装效果的方法
Mar 04 Javascript
jQuery Form表单取值的方法
Jan 11 Javascript
jQuery实现验证码功能
Mar 17 Javascript
vue2.0使用swiper组件实现轮播效果
Nov 27 Javascript
JS实现的合并两个有序链表算法示例
Feb 25 Javascript
TypeScript中的方法重载详解
Apr 12 Javascript
arctext.js实现文字平滑弯曲弧形效果的插件
May 13 Javascript
VUE+elementui面包屑实现动态路由详解
Nov 04 Javascript
javascript字符串替换函数如何一次性全部替换掉
Oct 30 #Javascript
JS实现带提示的星级评分效果完整实例
Oct 30 #Javascript
jQuery实现仿QQ空间装扮预览图片的鼠标提示效果代码
Oct 30 #Javascript
jQuery密码强度检测插件passwordStrength用法实例分析
Oct 30 #Javascript
基于jQuery实现的美观星级评论打分组件代码
Oct 30 #Javascript
jQuery实现的个性化返回底部与返回顶部特效代码
Oct 30 #Javascript
自己动手写的javascript前端等待控件
Oct 30 #Javascript
You might like
正则表达式语法
2006/10/09 Javascript
通过ODBC连接的SQL SERVER实例
2006/10/09 PHP
PHP Squid中可缓存的动态网页设计
2008/09/17 PHP
php目录操作函数之获取目录与文件的类型
2010/12/29 PHP
php中的字符编码转换函数用法示例
2014/10/20 PHP
PHP产生不重复随机数的5个方法总结
2014/11/12 PHP
PHP实现通用alert函数的方法
2015/03/11 PHP
php 自定义函数实现将数据 以excel 表格形式导出示例
2019/11/13 PHP
php获取小程序码的实现代码(B类接口)
2020/06/13 PHP
详解Angularjs filter过滤器
2016/02/06 Javascript
理解js回收机制通俗易懂版
2016/02/29 Javascript
原生javascript实现的一个简单动画效果
2016/03/30 Javascript
jQuery原理系列-css选择器的简单实现
2016/06/07 Javascript
后端接收不到AngularJs中$http.post发送的数据原因分析及解决办法
2016/07/05 Javascript
深入理解bootstrap框架之入门准备
2016/10/09 Javascript
JS 拦截全局ajax请求实例解析
2016/11/29 Javascript
jsTree使用记录实例
2016/12/01 Javascript
微信小程序图表插件wx-charts用法实例详解
2019/05/20 Javascript
[53:50]CHAOS vs Mineski 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
python实现清屏的方法
2015/04/30 Python
在Django框架中设置语言偏好的教程
2015/07/27 Python
python实现拓扑排序的基本教程
2018/03/11 Python
python中matplotlib的颜色及线条控制的示例
2018/03/16 Python
Python实现对字典分别按键(key)和值(value)进行排序的方法分析
2018/12/19 Python
Python多进程编程常用方法解析
2020/03/26 Python
终于搞懂了Keras中multiloss的对应关系介绍
2020/06/22 Python
乌克兰在线药房:Аптека24
2019/10/30 全球购物
PHP解析URL是哪个函数?怎么用?
2013/05/09 面试题
毕业生求职简历的自我评价
2013/10/23 职场文书
实习鉴定范文
2013/12/19 职场文书
工地宣传标语
2014/06/18 职场文书
泸县召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
公司承诺函范文
2015/01/21 职场文书
企业承诺书格式范文
2015/04/28 职场文书
2016年教师节特级教师获奖感言
2015/12/09 职场文书
Python使用scapy模块发包收包
2021/05/07 Python