调用方式:
iTimerID = window.setTimeout(vCode, iMilliSeconds [, sLanguage])
功能:
Evaluates an expression after a specified number of milliseconds has elapsed. 在 超过一定的时间间隔(iMilliSeconds,这个参数以毫秒为单位,如果你输入1000,则表示一秒)之后执行表达式vCode,这个vCode可 以是一段程序,亦可以是一个函数指针,即函数名称。
例如:
window.setTimeout("alert('Hello, world')", 1000);
或函数指针
function func1() {alert("Hello, world");}
window.setTimeout(func1, 1000);
注意,在第二种调用方法中,你是不能向函数传递参数的,
例如:
function func2(message) { alert( message ); }
像以下的调用方式:
window.setTimeout(func2("Hello world"), 1000);
将产生“参数无效”的错误, 因为该写法是在调用func2方法,并非向 setTimeout 传递一个函数指针 。
要避免这种错误,那么就写成第一种方式好了:window.setTimeout("func2('Hello world')", 1000);
这个 window.setTimeout 方法的返回值什么呢? window.setTimeout 亦可解释为 “ 延迟执行 ”。
例如 window.setTimeout(func1, 5000); 表示,func1() 函数,并不在该语句执行时立即执行,
而是从该语句执行后算起,延后 5 秒执行。所以,window.setTimeout 方法的返回值本质上就是这个 “ 延迟执行 ”的进程的ID。(根《JavaScript高级程序设计》一书)。如果你在这 5 秒的等待过程中,想取消
这个进程,那个这个ID就会起作用了。通过调用 window.clearTimeout(iTimeoutID) 方法,并向该方法中传递
你在 iTimerID = window.setTimeout(vCode, iMilliSeconds [, sLanguage]) 中获得的ID,即可取消延迟执行。
因此,如果你想要取消 延迟执行 ,所定义的变量 iTimerID 必须是一个全局变量(global variable )。
setInterval 介绍:
iTimerID = window.setInterval(vCode, iMilliSeconds [, sLanguage]) 该方法与 window.setTimeout
方法最大的区别是:该方法执行多次,即按一定的时间间隔不断地执行。其他方面,都是相同的。
要取消执行,可以调用。window.clearInterval(iIntervalID) 方法。
提示:如果我们在 window.setTimeout 调用的函数中,再调用一次 window.setTimeout 方法,那不是实现了
setInterval 的效果
setTimeout为0的应用
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>setTimeout为0的应用</title>
<style type="text/css">
body { background:url(images/page-bg.gif); font-size:14px;}
</style>
</head>
<body>
<h1>setTimeout为0的应用</h1>
<p>在下面两个输入框里输入字符,看看有什么不同?</p>
<p>
A:<input type="text" id="t1" name="t1"
onkeydown="document.getElementById('t1text').innerHTML='你输入了:'+this.value;" value="" />没有使用setTimeout
</P>
<div id="t1text">你输入了:</div>
<p>
B:<input type="text" id="t2" name="t2"
onkeydown="var t2=this;setTimeout(function(){document.getElementById('t2text').innerHTML='你输入了:'+t2.value},0);"
value="" />setTimeout为0</p>
<div id="t2text">你输入了:</div>
</body>
</html>
类似起线程。前者没用settimeout ,所以是主线程去做的响应,所以在onkeydown 就触发事件执行。得到的数据会有差异。
setTimeout与setInterval是window对象的两个非常神奇方法,用于实现定时或延时调用一个函数或一段代码。
(新手可能认为setTimeout与setInterval是javascript函数,这是错误的。新手容易将javascript对象函数与DOM对象方法混淆。)
先来一段代码,大家猜猜在各种浏览器下的结果会是怎么样的呢?
JScript code, 'VBScript');
(二)Mozilla系列中的setTimeout
我们看看Mozilla官方网站上 Gecko DOM Reference 手册中是如何说的:
window.setTimeout
Summary
Executes a code snippet or a function after specified delay.
Syntax
var timeoutID = window.setTimeout(func, delay, [param1, param2, ...]);
var timeoutID = window.setTimeout(code, delay);
前两个参数都一样,没差别,从第三个参数就不同了。
因为目前只有IE浏览器支持多种语言的脚本,其它浏览器只支持js脚本所以不需要传语言类型的参数。
Mozilla把传给setTimeout的第3个以及更后面的更多参数依次的传给前面的func做为参数。
Firefox, Opera, Safari, Chrome等等也都是如此。
但是注意到,Mozilla上说了他家的setTimeout有一个叫做"Lateness" argument的BUG.
"Lateness" argument
Functions invoked by setTimeout are passed an extra "lateness" argument in Mozilla,
i.e., the lateness of the timeout in milliseconds. (See bug 10637 and bug 394769.)
这就是开头那个例子中,Firefox(3.0)下有一个乌龙数字的根源。
Mozilla上关于setTimeout的说明:
https://developer.mozilla.org/en/DOM/window.setTimeout
(三)其它浏览器系列(Opera, Safari, Chrome)中的setTimeout
和Mozilla系列中的基本一样,但是没有Mozilla系列中的多一个参数的BUG.
武林外传:使用setTimeout的小技巧
(1)IE中给setTimeout中的调用函数传参数
上面的分析可知,IE是不支持在setTimeout中给被调用的函数传参数的,为了浏览器世界的和谐,我们可以把函数调用参数包裹进新的匿名函数中。示例:
function f(a){
alert(a);
}
// setTimeout(f,50,'hello'); //用于非IE
setTimeout(function(){f('hello')},50); //通用
var str='hello';
setTimeout(function(){f(str)},50); //通用
(2)this问题
setTimeout调用的函数被执行时的上下文是全局,而不再是调用setTimeout方法时的上下文。所以,setTimeout的第一个参数 的函数被执行时其this是指向window的,如果需要保留调用setTimeout方法时的this,就需要把当时的this传进去。示例:
function Person(name){
this.name=name;
var f=function(){alert('My name is '+this.name)};
// setTimeout(f,50); //错误
var THIS=this;
setTimeout(function(){f.apply(THIS)},50); //正确,通用
setTimeout(function(){f.call(THIS)},50); //正确,通用
}
new Person('Jack');