2009-10-27 72 views
1

我觉得这很有趣。考虑下面的代码,window.onload和body onload =“”调用相同的函数。但结果不同。在我看来,window.onload对集合有一个问题。下面的代码:window.onload!= <body onload =“”>

<html> 
<script type="text/javascript"> 

    window.onload = getSpanElements(); 

    function getSpanElements(){ 
     var collectionBoolean = document.getElementsByTagName("span")?true:false; 
     alert(
      "collection exists? " + collectionBoolean + "; number of collection members: " + document.getElementsByTagName("span").length 
     ); 
    } 


</script> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> 
    <title>Untitled Document</title> 
</head> 
<body onload="getSpanElements()"> 
    <span> test </span> 
</body> 

正如你可以看到,这两个报告,集合存在,但是在window.onload报告说,它没有任何成员。有任何想法吗?

回答

11

你设置功能失常:

window.onload = getSpanElements(); 

应该

window.onload = getSpanElements; 

你onload处理设置为getSpanElements()目前的返回值。

+0

绝对正确!谢谢:) – 2009-10-27 22:09:12

0

我认为window对象是在解析任何实际元素之前创建的。

+0

我会假设如此,但它很清楚集合存在,这就是让我困惑的地方。 – 2009-10-27 22:03:48

10
window.onload = getSpanElements(); 

应该

window.onload = getSpanElements; 

的代码,你有电话getSpanElements功能及其返回值分配的onload事件处理程序。

+0

绝对正确!谢谢:) – 2009-10-27 22:09:55

2

您可能想要移动以下getSpanElements声明你的window.onload分配:你在哪里分配window.onload事件处理程序

<html> 
<script type="text/javascript"> 


     function getSpanElements(){ 
       var collectionBoolean = document.getElementsByTagName("span")?true:false; 
       alert(
         "collection exists? " + collectionBoolean + "; number of collection members: " + document.getElementsByTagName("span").length 
       ); 
     } 

     window.onload = getSpanElements; 

</script> 
<head> 
     <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> 
     <title>Untitled Document</title> 
</head> 
<body onload="getSpanElements()"> 
     <span> test </span> 
</body> 

在你的代码点,getSpanElements()尚未已被定义。另外,行应该是

window.onload=getSpanElements; 

window.onload=getSpanElements(); 

函数名没有括号是对函数的引用。使用括号,它执行该函数并将返回值分配给window.onload。

+2

由于getSpanElements是用函数语句而不是函数表达式定义的,因此它可能会被提升 - 因此它不需要以代码顺序出现在赋值之前。 – Quentin 2009-10-27 22:09:44

+0

是的,我打电话而不是参考。谢谢! – 2009-10-27 22:10:31

3

你错误地这样做:

window.onload = getSpanElements(); 

这台window.onload到调用的结果给函数getSpanElements(不确定)。

你应该这样做,而不是:

window.onload = getSpanElements; 
+1

实际上,函数返回'undefined',而不是'null' – Christoph 2009-10-27 22:08:34

+0

现在编辑,谢谢Christoph :) – Seb 2009-10-27 22:09:50

1

你必须getSpanElementswindow.onload为参考分配给功能 - 目前,该功能没有得到执行onload,但分析后即可。

你实际分配的是未定义的返回值。

总之:降()