2011-08-20 58 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更好。 –