2009-10-27 8 views
1

C'est plutôt intéressant, je pense. Considérons le code suivant, à la fois window.onload et body onload = "" appellent la même fonction. Cependant, les résultats sont différents. Il me semble que window.onload a un problème avec les collections. Voici le code: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> 

Comme vous pouvez le voir, à la fois que la signaler collection existe, cependant window.onload rapports qu'il n'a pas de membres. Des idées?

Répondre

11

vous réglez la mauvaise fonction:

window.onload = getSpanElements(); 

devrait être

window.onload = getSpanElements; 

vous configurez le gestionnaire onload à la valeur de retour de getSpanElements() au moment.

+0

tout à fait raison! merci :) –

0

Je pense que l'objet window est créé avant que les éléments réels soient analysés.

+0

Je le suppose aussi bien, mais il est bien conscient que la collection existe, c'est ce qui me trouble. –

10
window.onload = getSpanElements(); 

devrait être

window.onload = getSpanElements; 

Le code que vous avez appels la fonction getSpanElements et cède ses valeur de retour en tant que gestionnaire d'événements onload.

+0

tout à fait raison! thanks :) –

2

Vous pouvez déplacer votre mission window.onload ci-dessous la déclaration getSpanElements:

<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> 

Au point dans votre code où vous affectez le gestionnaire d'événements window.onload, getSpanElements() n'a pas encore été défini. En outre, la ligne devrait être

window.onload=getSpanElements; 

pas

window.onload=getSpanElements(); 

Le nom de la fonction sans parenthèses est une référence à la fonction. Avec des parenthèses, il exécute la fonction et la valeur de retour est assignée à window.onload.

+2

Étant donné que getSpanElements est défini avec l'énoncé de la fonction plutôt qu'avec l'expression de la fonction, il est soumis au levage - il n'a donc pas besoin d'apparaître avant l'affectation dans l'ordre du code. – Quentin

+0

oui, j'ai fait un appel au lieu d'une référence. Je vous remercie! –

3

Vous faites tort ceci:

window.onload = getSpanElements(); 

qui fixe le window.onload au résultat de l'appel à la fonction getSpanElements (non définie).

Vous devez le faire à la place:

window.onload = getSpanElements; 
+1

en fait, la fonction renvoie 'undefined', pas' null' – Christoph

+0

Édité maintenant, merci Christoph :) – Seb

1

Vous devez attribuer une référence à la fonction getSpanElements-window.onload - actuellement, la fonction ne soit pas exécutée onload, mais immédiatement après l'analyse syntaxique.

Ce que vous affectez réellement est la valeur de retour indéfinie.En bref: déposez le ().

Questions connexes