2010-08-12 81 views
1
<script> 
    window.onload= function(){ 
     var a = document.getElementById('a'); 
     var b = document.getElementById('ct'); 
     setInterval('b.innerHTML = a.duration',1000); 
    }; 
</script> 
//Second script 
<script> 
    var a = document.getElementById('a'); 
    var b = document.getElementById('ct'); 
    window.onload= function(){ 
     setInterval('b.innerHTML = a.duration',1000); 
    }; 
</script> 

为什么第一个脚本不能正常工作?为什么它在document.onload中不起作用?

铬:

Uncaught ReferenceError: b is not defined

+0

你有一个id为'ct'的元素吗?这将导致参考错误... – Tommy 2010-08-12 13:24:12

回答

1

我的猜测be:因为你在a和上使用在第一个脚本中。这使window.onload(而不是全局)中的变量局部变量,setInterval中的代码无法访问它们。

删除var它应该工作。

+0

对,但是VAR和NOT VAR有什么不同? – Snoob 2010-08-12 13:31:50

+0

var是您在“var a = ...”中编写的关键字。它说“这是一个局部变量,而不是全球变量”。尽管在函数中使用它通常是一件好事(为了保持全局名称空间的干净),在这种情况下,它会使setInterval中的代码不会找到变量。 – scy 2010-08-12 13:32:45

+0

感谢............... – Snoob 2010-08-12 13:33:10

2

你需要指定一个函数作为参数传递给setInterval,你有问题就在这里:

setInterval('b.innerHTML = a.duration',1000); 

应该是:

setInterval(function foo(){b.innerHTML = a.duration},1000); 
+0

这不可能是这种情况,因为错误消息清楚地表明代码实际上已执行。 – scy 2010-08-12 13:30:05

+2

@Scytale: 这是一种替代语法。文本可以在全局范围内运行,function(){}可以有自己的闭包。 – 2010-08-12 13:42:11

+0

如果像这样编写setInterval,则匿名函数将成为局部变量的闭包,所以即使稍后执行,它也将继续访问它们。 – 2010-08-12 13:45:56

-1

您不能引用.onload中的文档元素,因为文档尚未加载到那里。将代码移动到</body>之前的文档末尾。

它还避免了.onload中多个事件处理程序的问题,因为实际上是覆盖了任何预先存在的事件处理程序。使用addEventListener附加事件处理程序。

这样的:

<body> 

// markup 

<script> 
var a = document.getElementById('a'); 
var b = document.getElementById('ct'); 


setInterval('b.innerHTML = a.duration',1000); 

</script> 

</body> 
+0

-1。这是不正确的,当onload事件被触发时文档被完全加载。此外,将代码放在body标签的结尾之前会使其更早执行。 – Guffa 2010-08-12 13:48:34

1

setInterval在全球范围内运行。您在setInterval中引用的任何变量都无法从全局范围访问 - 例如第一个示例中的本地ab - 将在执行时未定义。

1

在第一个脚本中,“a”和“b”是在事件范围内定义的变量。 “setInterval”在文档(全局)范围中查找“innerHTML”属性。 在第二个示例中,“a”和“b”在事件定义之外,即直接在文档范围中定义,以便通过“setInterval”函数进行重新定位。

相关问题