2010-08-12 6 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> 

Pourquoi le premier script ne fonctionne pas?Pourquoi cela ne fonctionne-t-il pas dans document.onload?

Chrome:

Uncaught ReferenceError: b is not defined

+0

Avez-vous un élément avec l'ID 'ct'? Cela provoquerait une erreur de référence ... – Tommy

Répondre

1

Je dirais être: parce que vous utilisez var sur a et b dans le premier script. Cela rend les variables locales dans window.onload (au lieu de global), et le code dans setInterval ne peut pas y accéder.

Supprimez le var et cela devrait fonctionner.

+0

Droit, mais quelle est la différence de VAR et non VAR? – Snoob

+0

var est le mot-clé que vous avez écrit dans "var a = ...". Il dit "c'est une variable locale, pas une variable globale". Alors qu'il est normalement une bonne chose de l'utiliser dans les fonctions (afin de garder l'espace de noms global propre), dans ce cas, il conserve le code dans setInterval de trouver les variables. – scy

+0

Merci ... – Snoob

2

Vous devez spécifier une fonction comme argument à la setInterval, vous avez un problème ici:

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

devrait être:

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

Cela ne peut pas être le cas, car le message d'erreur montre clairement que le code est réellement exécuté. – scy

+2

@Scytale: Ceci est une syntaxe alternative. le texte on courrait dans la portée globale, la fonction() {} on aurait sa propre fermeture. –

+0

Si vous écrivez votre setInterval comme ceci, la fonction anonyme devient une fermeture sur les variables locales, donc elle continuera à y avoir accès même si elle est exécutée plus tard. –

-1

Vous ne pouvez pas référencer les éléments de documents dans .onload car le document n'a pas encore été chargé. Déplacez le code à la fin du document juste avant </body>.

Cela évite également des problèmes avec plusieurs gestionnaires d'événements dans .onload, car vous écrasez réellement les gestionnaires d'événements préexistants. Utilisez addEventListener pour attacher des gestionnaires d'événement.

comme ceci:

<body> 

// markup 

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


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

</script> 

</body> 
+0

-1. Ce n'est pas correct, le document est complètement chargé lorsque l'événement onload est déclenché. De plus, mettre le code avant la fin du corps le ferait s'exécuter encore plus tôt. – Guffa

1

setInterval fonctionne dans la portée globale. Toutes les variables auxquelles vous faites référence dans setInterval qui ne sont pas accessibles depuis la portée globale - comme les a et b locaux dans le premier exemple - ne seront pas définies au moment de l'exécution.

1

dans le premier script "a" et "b" sont des variables définies dans la portée de l'événement. Le "setInterval" recherche la propriété "innerHTML" dans la portée de document (global). Dans le deuxième échantillon, "a" et "b" sont en dehors de la définition d'événement, c'est-à-dire définis directement dans la portée du document, de sorte qu'ils sont reconisés par la fonction "setInterval".

Questions connexes