先来一段代码,大家猜猜在各种浏览器下的结果会是怎么样的呢?function f(){ var s = 'arguments.length:'+arguments.length+'; ';for(var i=0,n=arguments.length;i< n;i++){ s += ' ['+i+']:'+arguments[i]+'; '; } alert(s); } setTimeout(f,500,"javascript","AAA"); setTimeout与setInterval的参数和用法是一样的,只是功能不同
各种浏览器下的结果: IE(6,7,8)是: arguments.length:0; Opera(6,7,8)是: arguments.length:2; [0]:javascript; [1]:AAA; Firefox(3.0)是: arguments.length:3; [0]:javascript; [1]:AAA; [2]:0;
原因分析: 1) IE系统浏览器: 首先,我们看看微软出的DHTML参考手册中是如何说的: setTimeout Method Evaluates an expression after a specified number of milliseconds has elapsed. Syntax iTimerID = window.setTimeout(vCode, iMilliSeconds [, sLanguage])
Parameters vCode Required. Variant that specifies the function pointer or string that indicates the code to be executed when the specified interval has elapsed. iMilliSeconds Required. Integer that specifies the number of milliseconds. sLanguage Optional. String that specifies one of the following values: JScript Language is JScript. VBScript Language is VBScript. JavaScript Language is JavaScript. 在IE中,setTimeout接收3个参数,第3个参数表示脚本语言的类型,如果你再传入更多的参数,是无意义的。因此,在IE中,以下两种都是对的。 setTimeout('alert(1)', 50); setTimeout('msgbox "终止、重试、忽略,您看着办吧。", vbAbortRetryIgnore + vbDefaultButton2, "告诉您"', 50, 'VBScript');
2) Mozilla系统浏览器: 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中存在一个BUG,就是一开始的例子中,本来只传递了两个参数,结果却出来了三个参数,就是说存在一个没有意思的参数
4. 各浏览器中的解决方法
IE是不支持在setTimeout中给被调用的函数传参数的,为了浏览器世界的和谐,我们可以把函数调用参数包裹进新的匿名函数中。示例:
var width = $("#ctl00_cphContent_divGallery td").css("width"); //画廊中每个缩略图的宽度 width = parseInt(width, 10); //将宽度保存为整数 var gallery = document.getElementById("ctl00_cphContent_divGallery"); //获取画廊的容器元素 MyMar = setInterval(function(){Marquee(width, gallery, "left")}, 20); //设置滚动动画,每20毫秒调用一次 通过在匿名函数中调用带参数的自定义函数,这样的语句在IE和非IE中都可以运行。