2012-03-31 10 views
3

Ich habe eine JavaScript-Funktion, die funktioniert, wenn es anonym ist, aber funktioniert nicht mehr, wenn ich es in named ändern .. Warum?Zugriff auf Element von einer benannten Javascript-Funktion

hier ist der Code, das funktioniert:

setInterval(function(){ 
<% @root.children.all(:order => "idx DESC").each do |child| %> 
     var text2 = "<%= child.content %>"; 
     var pjs = Processing.getInstanceById("mysketch2"); 
    pjs.update(text2); 
    <% end %> 

}, 3000) 

Hier den Code ist, die nicht ..

<script> 
    var interval = setInterval(drawGraph(),1000); 
    function drawGraph(){ 
    <% @root.children.all(:order => "idx DESC").each do |child| %> 
     var text2 = "<%= child.content %>"; 
     var pjs = Processing.getInstanceById("mysketch2"); 
     pjs.update(text2); 
     <% end %> 

    } 

</script> 

ich die ‚Uncaught Typeerror: Kann Methode nicht nennen 'get funktioniert update' undefinierter ". Der seltsamste Teil ist, dass ich sehen kann, dass das Processing.js-Fenster auf dem Bildschirm gezeichnet wird, aber das ist es. Mit der Arbeitsversion (die erste in diesem Post) ist alles in Ordnung und der Inhalt des Fensters wird ebenfalls gezeichnet.

Ich habe versucht, pjs in eine globale Variable außerhalb der Funktion drawGraph(), aber kein Glück ... Was vermisse ich? Danke!

+0

Könnte es sein, dass die Funktion drawGraph über dem Aufruf in setInterval definiert werden muss? – TGH

+0

Nur um das Bild zu vervollständigen - das ist möglich, aber nicht empfehlenswert, da es implizit ausgeführt wird: var interval = setInterval ("drawGraph()", 1000); – mplungjan

Antwort

2

Es sollte

setInterval(drawGraph,1000); 

werden nicht

setInterval(drawGraph(),1000); 

Auch sollte die Funktion vor der setInterval Anweisung deklariert werden

+0

Vielen Dank viel! – Stpn

+0

Was ist, wenn ich drawGraph mit Parametern aufrufen möchte? Wie drawGraph (id)? – Stpn

+0

Verwenden Sie bind. Zum Beispiel: var f = Funktion (id) {...}. Bind (someId); setInterval (f, 1000); –

2

Die beiden Code-Snippet nicht gleichwertig sind: in der ersten Sie übergeben an die setInterval-Funktion einen Verweis auf eine unbenannte Funktion. Im zweiten Snippet rufen Sie drawGraph() auf und übergeben den Ergebniswert an setInterval.

Versuchen mit:

var interval = setInterval(drawGraph, 1000); 

und die Definition von DrawGraph vor dem Aufruf von setInterval bewegen.

Verwandte Themen