2011-08-20 57 views
0

下面的JavaScript代碼在Chrome上運行,並導致「背景」窗口被調整到我的規格:的JavaScript的setTimeout()和窗口功能

var background; 
function play() { 
    var w = screen.width; 
    var h = screen.height; 
    if(!background || background.closed) background = window.open("background.html", "It's a pop-up!", "top="+ 100 +",left="+ 770 +",width="+ w/3 +",height="+ h/3 +",location=no,menubar=no,scrollbars=no,status=no,toolbar=no,resizable=no"); 
    background.resizeTo(w,724); 
} 

當我試圖拖延調整大小功能,然而, ,代碼中斷。爲什麼打電話setTimeout("background.resizeTo(w,724)",10000)沒有可見的結果?

+0

可能是範圍問題。 'setTimeout(function(){background.resizeTo(w,724);},10000)'工作嗎?我希望你知道'10000'是10秒。所以你沒有看到任何直接的變化。 *編輯:*是的,@約翰是對的,'w'是問題。不過,不要傳遞一個字符串,而應該傳遞一個函數。 –

+0

我已回滾編輯,因爲它會使現有答案無效。 –

回答

1

將其更改爲

setTimeout(function(){background.resizeTo(w,724);},10000); 

你應該通過一個函數。這是一個合適的解決方案,在使用setTimeout()setInterval()時,千萬不要依賴將字符串作爲「函數」來傳遞,因爲它必須進行評估並且不正確。

此外,你可能有問題的範圍(如你的例子)。只有在backgroundw均爲全球的情況下,您的代碼纔有效。我們不知道background,但w絕對只在play本地。傳遞一個函數關閉這些變量(一個關閉)而不是一個字符串,解決了這個問題。

欲瞭解更多的信息:https://developer.mozilla.org/en/DOM/window.setTimeout#Syntax

+0

傳遞一個字符串也是有效的,但不好的做法。 *「後一種方法甚至不應該按照ECMAScript規範工作」*:'setTimeout'是**不是規範的一部分。 'window'是一個宿主對象,它不在規範中。 –

+0

我提到它.. – Baz1nga

+0

FWIW,必須由全局對象實現的屬性[可在此處找到](http://ecma262-5.com/ELS5_HTML.htm#Section_15.1)。但'setTimeout'和朋友不是它的一部分。 –

-1

因爲整個陳述基本上是eval'd和w沒有意義了。

試試這個:

setTimeout('background.resizeTo('+w+',724',10000); 
+1

正確,但不是傳遞一個字符串,而是應該傳遞一個函數。 –

+0

野外匿名關閉並不比一天結束時的eval更好。 –