在Web页面中使用计时器
在Web页面中使用计时器
在JavaScript中,可以创建两种类型的计时器,即一次性计时器和间隔性触发计时器。一次性计时器仅在指定的延迟时间之后触发一次,而间隔性触发计时器每隔一定的时间间隔就触发一次。在下面的小节中,我们将详细讨论这两种计时器。
实际上,在JavaScript中可以根据需要设置多个计时器,并在代码中的任何地方启动计时器,例如在浏览器窗口的onload事件中启动计时器,或者在单击一个按钮时启动计时器。计时器常用在每隔一定间隔后翻转广告图片的情形,或者在Web页面中显示一个实时更新的时钟。另外,使用DHTML所创建的各种动画,都需要使用计时器的setTimeout()方法或者setInterval()方法—— 在本书的第12章和13章,我们将介绍DHTML的相关内容。
9.2.1 一次性计时器
要设置一个一次性计时器非常简单:只需使用window对象的setTimeout()方法。
window.setTimeout("your JavaScript code", milliseconds_delay)
setTimeout()方法接收两个参数,第一个参数是要执行的JavaScript代码,第二个参数是计时器延迟的时间,延迟时间是以毫秒(即千分之一秒)为单位的,当延迟时间结束时,第一个参数中的代码将被执行。
setTimeout()方法将返回一个值,该值是一个整数,这是唯一标识该计时器的一个ID号。如果在计时器启动后想要停止计时器,在JavaScript就可以使用该ID号来引用相应的计时器。
例如,要设置一个在页面加载3秒之后触发的计时器,可以使用如下所示的代码:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<script language="JavaScript" type="text/javascript">
var timerID;
function window_onload()
{
timerID = setTimeout("alert(‘Times Up!’)",3000);
alert("Timer Set");
}
</script>
</head>
<body language = JavaScript onload="window_onload()">
</body>
</html>
将上面的代码保存为timertest.htm,并在浏览器中加载该文件。在浏览器窗口的onload事件之后延迟3000毫秒(即3秒钟)之后,将弹出一个消息对话框。
尽管setTimeout()方法是window对象的方法,但由于window对象位于浏览器对象模型层次结构的顶端,所以在引用window对象的属性或者方法时并不需要使用window对象名。因此,我们也可以将window.setTimeout()方法简写为setTimeout()方法。
值得注意的是,当设置一个计时器时并不会停止脚本代码的继续执行。计时器将在后台运行并在延迟到点之后触发。在这期间,页面将像往常一样运行,并且任何在启动计时器倒计时之后的代码都将继续执行。因此,在上面的例子中,在设置计时器的代码被执行之后,alert("Timer Set")语句将立即被执行,以弹出一个消息对话框,说明计时器已经被设置。
但是,如果要在计时器触发之前,停止计时器的执行,又该怎么办呢?
要清除一个计时器,可以使用window对象的clearTimeout()方法。该方法仅接收一个参数,即由setTimeout()方法返回的唯一的计时器ID号。
下面的代码修改了前面的例子,以提供一个按钮,当单击按钮时将停止计时器的执行。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<script language=JavaScript type="text/javascript">
var timerID;
function window_onload()
{
timerID = setTimeout("alert(‘Times Up!’)",3000);
alert("Timer Set");
}
function butStopTimer_onclick()
{
clearTimeout(timerID);
alert("Timer has been cleared");
}
</script>
</head>
<body onload="window_onload()">
<form name=form1>
<input type="button" value="Stop Timer" name=butStopTimer language=JavaScript
onclick="return butStopTimer_onclick()">
</form>
</body>
</html>
将上面的代码保存为timertest2.htm,并在浏览器中加载该文件。如果在3秒钟的延迟到点之前,单击Stop Timer按钮,则该计时器将被清除。在代码中,Stop Timer按钮的onclick事件处理器被连接到了butStopTimer_onclick()事件处理函数,在该事件处理函数中,使用了window对象的clearTimeout()方法,将ID号为timerID的计时器清除。
在下面的例子中,我们将使用setTimeout()方法来更新广告标语。下面的代码将创建一个具有广告标语的Web页面,每隔3秒钟广告标语将更新一次。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<script language=JavaScript type="text/javascript">
var currentImgNumber = 1;
var numberOfImages = 3;
function window_onload()
{
setTimeout("switchImage()",3000);
}
function switchImage()
{
currentImgNumber++;
document.imgAdvert.src = "AdvertImage" + currentImgNumber + ".jpg";
if (currentImgNumber < numberOfImages)
{
setTimeout("switchImage()",3000); }
}
</script>
</head>
<body onload="window_onload()">
<img src="AdvertImage1.jpg" name="imgAdvert">
</body>
</html>
在编辑器中输入上面的代码,并保存为Adverts.htm文件。另外,我们还需要创建三个图形文件:AdvertImage1.jpg、AdvertImage2.jpg和AdvertImage3.jpg文件(或者,也可以从本书的代码下载中获得这三个文件)。当页面被加载时,开始时将看到一个AdvertImage1.jpg图片,如图9-5所示。
图 9-5
3秒钟之后,该页面将显示第二幅图片,如图9-6所示。
图 9-6
最后,再经过3秒钟时间,将显示第三幅图片,也就是最后一幅图片,如图9-7所示。
图 9-7
代码解说
当页面加载时,<img>标记的src属性被设置为第一幅图片的文件名:
<img src="AdvertImage1.jpg" name="imgAdvert">
在<body>标记中,将window对象的onload事件处理器连接到了window_onload()事件处理函数。window_onload()函数如下所示:
function window_onload()
{
setTimeout("switchImage()",3000)
}
在window_onload()函数中,使用了setTimeout()方法以启动计时器的运行,该计时器将在延迟3s后调用switchImage()函数。因为这个计时器不需要清除处理,所以不必考虑保存setTimeout()方法所返回的计时器ID的值。
switchImage()函数用以改变页面中<img>标记所对应的img对象的src属性的值:
function switchImage()
{
currentImgNumber++;
document.imgAdvert.src = "AdvertImage" + currentImgNumber + ".jpg";
标语图片名中的数字是从1到3,即AdvertImage1.jpg、AdvertImage2.jpg、AdvertImage3.jpg。可以将页面中加载的当前标语图片的编号保存在全局变量currentImgNumber中,该变量定义于脚本块的顶部,并被初始化为1。要获得下一幅图片的编号,只需简单地将变量currentImgNumber的值加1,然后使用变量currentImgNumber的值来构造表示图片文件名的完整字符串,再修改img对象的src属性,以更新页面所加载的图片。
if (currentImgNumber < numberOfImages)
{
setTimeout("switchImage()",3000);
}
}
要显示的标语图片有三幅,变量currentImgNumber中保存的是当前图片的编号。因此,在上面的if语句中,将对变量currentImgNumber的值进行检查,以确定该变量的值是否小于3。如果小于3,则表示还有图片需要显示,因此设置另一个新的计时器,以启动一个新的倒计时触发。当再经过3s之后,该计时器将再次调用switchImage()函数。
在一些早期的浏览器中,只能使用上面的办法来创建每隔一定时间间隔就触发的计时器。但是,对于4.0版本以上的浏览器,还可以使用下面小节将要介绍的简单方法,以创建间隔性触发计时器。
9.2.2 创建间隔性触发计时器
在较新版本的浏览器中,window对象提供了一些新的方法用以设置计时器,即setInterval()方法和clearInterval()方法。除了所设置的计时器每隔一定时间间隔就触发一次外,这两个方法的工作方式与setTimeout()方法和clearTimeout()方法非常类似。
与setTimeout()方法类似,setInterval()方法接收两个参数,第一个参数表示计时器到点时要执行的代码,不同的是,第二个参数不再表示计时器触发之前的时间延迟,而是表示一个时间间隔,该间隔以毫秒为单位,每隔这个时间间隔之后,计时器就将触发一次。
例如,要设置一个每隔5s就触发一次myFunction()函数的计时器,可以使用如下所示的代码:
var myTimerID = setInterval("myFunction()",5000);
与setTimeout()方法类似,setInterval()方法也返回一个计时器唯一的ID号,如果要清除该计时器,可以使用clearInterval()方法,并将该ID号作为参数传入即可。clearInterval()方法与clearTimeout()方法非常类似,因此,要停止前面代码中启动的计时器,可以使用如下所示的代码:
clearInterval(myTimerID);
下面我们来修改一下前面例子中的世界时转换器,以在页面中显示一个本地时间和所选中城市时间的实时更新的时钟。
我们只需在文本编辑器中打开WorldTimeConverter.htm文件,并对其进行修改。在已经定义好的函数之前,添加如下所示的函数:
var daylightSavingAdjust = 0;
function window_onload()
{
updateTimeZone();
window.setInterval("updateTime()",1000);
}
function updateTimeZone()
{
并将<body>标记修改为如下所示的代码:
<body onload="return window_onload()">
保存该文件,并在浏览器中加载WorldTimeConverterFrameset.htm页面。你将看到一个与前面的例子中类似的页面,不同之处在于,页面上的时间每秒钟都被更新一次。
代码解说
实际上,我们仅对代码作了少量的修改。在window_onload()函数中,添加了一个新的计时器,该计时器每隔1000毫秒(即1s)调用一次updateTime()函数。该计时器将每隔1000毫秒触发一次,直到用户离开该页面为止。在前面的例子中,仅当用户选中了下拉列表框中一个不同的城市时,或者当单击了夏令时复选框时,才会调用updateTime()函数。
window_onload()函数被连接到了window对象的onload事件,因此一旦页面被加载后,计时器就将开始运行。
关于计时器和世界时转换器的例子,我们就介绍到这里。在下面的小节中,我们将应用上面所学到的知识,将“在线小测试”程序修改为一个具有时间限制的测试程序。