Norrie: Elementübergabe bei window.setTimeout

Hallo,

Ich sitze hier gerade einen einem Problem was ich nicht ganz verstehe.
Ich hole mir mit getElementById ein gültiges Element und übergebe es an eine Funktion.

  
function abc() {  
	lala = document.getElementById("test");  
	if (lala) {  
		huhu(lala, 0);  
	}  
}  
  
function huhu(divElement, count) {  
	if (count < 5) {  
		divElement.innerHTML = "<p>hallo</p>";  
	}  
}  

Soweit so gut. Das Element ist in dieser Funktion problemlos zugreifbar und veränderbar - alles kein Problem.

Nun zum Problem. Ich ersetze die Funktion huhu durch folgende:

  
function huhu(divElement, count) {  
	if (count < 5) {  
		count++;  
		window.setTimeout("huhu("+divElement+","+count+")", 30);  
	}  
}  

Also ich will eine zeitlich gesteuerte Rekursion mit window.setTimeout einbauen, bekomme dann aber folgende Fehlermeldung von Firebug:

missing ] after element list  
huhu([object HTMLDivElement],1)

Wieso Element-Liste? getElementById ist doch eindeutig, nicht wie getElementsByName.

Kann mir jemand sagen was da schief ist oder wo ich einen Denkfehler habe?

Danke!
Norrie

  1. Kann mir jemand sagen was da schief ist oder wo ich einen Denkfehler habe?

    Dein divElement ist kein String. Wenn du es durch "" + divElement in einen umwandelt, wird es zu "[object HTMLDivElement]".
    Du musst eine closure erzeugen

      
    function huhu(divElement, count) {  
      if (count < 5) {  
        count++;  
     		window.setTimeout(function(){ huhu(divElement, count); }, 30);  
     	}  
    }  
    
    
    1. Prima!
      Danke, an ein closure habe ich noch nicht gedacht!

      Norrie

  2. Kann mir jemand sagen was da schief ist oder wo ich einen Denkfehler habe?

    Ja. Denkfehler:

    Also ich will eine zeitlich gesteuerte Rekursion ...

    Das ist keine Rekursion. Wenn du setTimeout benutzt, werden noch die restlichen Statements der Funktion abgearbeit und die Funktion beendet.

    Alle funktionsinternen Variablen sind jetzt verlore, z.B. divElement und count.

    Nach einer Zeit x wird die Funktion neu aufgerufen und hat keine Parameter. Du musst die Parameter ausserhalb der Funktion sichern.

    Schorsch

  3. Hallo,

    Nun zum Problem. Ich ersetze die Funktion huhu durch folgende:

    function huhu(divElement, count) {
    if (count < 5) {
    count++;
    window.setTimeout("huhu("+divElement+","+count+")", 30);
    }
    }

      
    
    > Also ich will eine zeitlich gesteuerte Rekursion mit window.setTimeout einbauen  
      
    ich empfehle Dir die Lektüre des Artikels [Komfortable Timer-Funktion](http://aktuell.de.selfhtml.org/artikel/javascript/timer/) von molily und Struppi.  
      
      
    Freundliche Grüße  
      
    Vinzenz
    
  4. Hallo,

    Okay, Problem erkannt - Problem nicht ganz gebannt. ;)
    Also, mit:

      
    window.setTimeout("huhu('"+divElement+"',"+count+")", 30);  
    
    

    kommt man zwar um die Fehlermeldung drumherum, allerdings gehen die Objektinformationen verloren, da das Objekt an dieser Stelle als 'String' interpretiert wird.

    Ich habe das nun geändert, indem ich nicht das Objekt sondern den id-String mitgebe. Finde ich zwar nicht so schön, funktioniert aber.

      
    function  abc() {  
            lala = document.getElementById("test");  
            if (lala) {  
                    huhu("test", 0);  
            }  
    }  
      
    function  huhu(id,  count) {  
            elem = document.getElementById(id);  
            if (count < 5) {  
                    count++;  
                    window.setTimeout("huhu('"+id+"',"+count+")", 30);  
            }  
    }  
    
    

    Falls doch noch jemand eine Idee hat wie man auf Element-Ebene arbeiten kann, bitte ruhig melden.

    Danke!
    Norrie