Objektreferenz als Parameter in setTimeout?
MrX
- javascript
Hallo,
ich habe eine Funktion Test(el), die eine Referenz auf ein Element übergeben bekommt.
function Test(el)
{ alert el.className;
}
wenn ich die Funktion aufrufe z.B. mit:
var Element = document.getElementById("MyEl");
Test(Element);
dann kann ich innerhalb der Funktion Test auf MyEL zugreifen, der className wird korrekt angezeigt.
Wenn ich aber die Funktion Test über setTimeout aufrufe:
var Element = document.getElementById("MyEl");
window.setTimeout("Test(" + Element + ")", 1000);
dann kann ich innerhalb der Funktion Test nicht auf MyEL zugreifen.
Es ist undefiniert, was mache ich falsch?
Danke für Hilfe!
Hallo MrX,
lokale Variablen sind möglicherweise bei der Abarbeitung einer verzögert aufgerufenen Funktion nicht mehr bekannt. Benutze globale Variablen als Parameter.
Gruß, Jürgen
Hallo,
lokale Variablen sind möglicherweise bei der Abarbeitung einer verzögert aufgerufenen Funktion nicht mehr bekannt. Benutze globale Variablen als Parameter.
Ähm naja man will keine globalen Variablen benutzen sondern clousures, molily hat schon öfters darüber geschrieben: http://forum.de.selfhtml.org/archiv/2006/4/t128130/#m827337
Grüße
Jeena Paradies
Hallo MrX.
function Test(el)
{ alert el.className;
}wenn ich die Funktion aufrufe z.B. mit:
var Element = document.getElementById("MyEl");
Test(Element);
>
> dann kann ich innerhalb der Funktion Test auf MyEL zugreifen, der className wird korrekt angezeigt.
>
> Wenn ich aber die Funktion Test über setTimeout aufrufe:
>
> ~~~javascript
var Element = document.getElementById("MyEl");
> window.setTimeout("Test(" + Element + ")", 1000);
dann kann ich innerhalb der Funktion Test nicht auf MyEL zugreifen.
Es ist undefiniert, was mache ich falsch?
Hast du dir einmal „el“ innerhalb der Funktion „Test“ ausgeben lassen? Tust du dies, solltest du so etwas wie „[object HTML…Element]“ erhalten. Du hast also beim Aufruf von setTimeout lediglich die in eine Zeichenkette umgewandelte Fassung des Elementobjektes übergeben, welches du dir über die ID „MyEl“ geholt hast.
Nun einfach nur den Funktionsaufruf zu notieren ist jedoch natürlich auch nicht das Gewünschte, da ja dann die Funktion „Test“ bereits beim Abarbeiten dieser Zeile ausgeführt würde.
Dir bleibt also die dritte Möglichkeit in Form einer anonymen Funktion:
var Element = document.getElementById('MyEl');
window.setTimeout(function() {
Test(Element);
}, 1000);
Hierbei würde nach „Element“ als erstes im Scope der anonymen Funktion gesucht. Da dies dort aber mangels Existenz nicht gefunden werden kann, geht es eine Ebene nach oben, wo nun schließlich eine passene Variable gefunden wird, welche der Funktion „Test“ übergeben werden kann.
Einen schönen Samstag noch.
Gruß, Mathias
Hallo nochmal.
Wenn ich aber die Funktion Test über setTimeout aufrufe:
var Element = document.getElementById("MyEl");
window.setTimeout("Test(" + Element + ")", 1000);
> >
> > dann kann ich innerhalb der Funktion Test nicht auf MyEL zugreifen.
> > Es ist undefiniert, was mache ich falsch?
>
> Hast du dir einmal „el“ innerhalb der Funktion „Test“ ausgeben lassen?
Mein Fehler: das ist gar nicht möglich, da ja bereits der Funktionsaufruf letztendlich wie folgt aussieht:
`Test([object HTML…Element]);`{:.language-javascript}
Dass dies nichts werden kann, sollte ersichtlich sein.
Einen schönen Samstag noch.
Gruß, Mathias
--
sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
debian/rules