Elementübergabe bei window.setTimeout
Norrie
- javascript
0 unknown0 Norrie
0 Schorsch0 Vinzenz Mai0 Norrie
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
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);
}
}
Prima!
Danke, an ein closure habe ich noch nicht gedacht!
Norrie
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
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
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