先來一段代碼,大家猜猜在各種瀏覽器下的結(jié)果會(huì)是怎么樣的呢?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的參數(shù)和用法是一樣的,只是功能不同
各種瀏覽器下的結(jié)果: 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系統(tǒng)瀏覽器: 首先,我們看看微軟出的DHTML參考手冊(cè)中是如何說的: 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個(gè)參數(shù),第3個(gè)參數(shù)表示腳本語言的類型,如果你再傳入更多的參數(shù),是無意義的。因此,在IE中,以下兩種都是對(duì)的。 setTimeout('alert(1)', 50); setTimeout('msgbox "終止、重試、忽略,您看著辦吧。", vbAbortRetryIgnore + vbDefaultButton2, "告訴您"', 50, 'VBScript');
2) Mozilla系統(tǒng)瀏覽器: Mozilla官方網(wǎng)站上 Gecko DOM Reference 手冊(cè)中是如何說的: 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); 前兩個(gè)參數(shù)都一樣,沒差別,從第三個(gè)參數(shù)就不同了。因?yàn)槟壳爸挥蠭E瀏覽器支持多種語言的腳本,其它瀏覽器只支持js腳本所以不需要傳語言類型的參數(shù)。 Mozilla把傳給setTimeout的第3個(gè)以及更后面的更多參數(shù)依次的傳給前面的func做為參數(shù)。 Firefox, Opera, Safari, Chrome等等也都是如此。 Mozilla中存在一個(gè)BUG,就是一開始的例子中,本來只傳遞了兩個(gè)參數(shù),結(jié)果卻出來了三個(gè)參數(shù),就是說存在一個(gè)沒有意思的參數(shù)
4. 各瀏覽器中的解決方法
IE是不支持在setTimeout中給被調(diào)用的函數(shù)傳參數(shù)的,為了瀏覽器世界的和諧,我們可以把函數(shù)調(diào)用參數(shù)包裹進(jìn)新的匿名函數(shù)中。示例:
var width = $("#ctl00_cphContent_divGallery td").css("width"); //畫廊中每個(gè)縮略圖的寬度 width = parseInt(width, 10); //將寬度保存為整數(shù) var gallery = document.getElementById("ctl00_cphContent_divGallery"); //獲取畫廊的容器元素 MyMar = setInterval(function(){Marquee(width, gallery, "left")}, 20); //設(shè)置滾動(dòng)動(dòng)畫,每20毫秒調(diào)用一次 通過在匿名函數(shù)中調(diào)用帶參數(shù)的自定義函數(shù),這樣的語句在IE和非IE中都可以運(yùn)行。