setTimeout

versuch13

Erfahrenes Mitglied
Hallo, ich versuche mich zur Zeit an JavaScript ran zu tasten und steh jetzt vor einem ich denke kleines Problem mit setTimeout. Habe schon im Forum und bei Selfhtml gesucht und bin auch fündig geworden, allerdings komme ich trotzdem nicht weiter. Ich sehe es doch richtig dass es an der Variablen Übergabe liegt? Hier einfach mal mein Versuch:

HTML:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Unbenanntes Dokument</title>
<style type="text/css">
.over {
    color:#f00;
}
</style>
<script type="text/javascript">
function omover(element) {
      element.className = "over";

}
function omout(element) {
    element.className = element.className.replace("over", "");
}
</script>
</head>

<body>

<a href="#" id="one" onmouseover="omover(this)" onmouseout="window.setTimeout('omout(this)', 900)">test</a>
        
</body>
</html>

Ich hoffe es wird erkenntlich was ich versuche, und zwar möchte ich bei mouseover den CSS Klassennamen ändern und bei mouseout auch, nur eben Zeitverzögert.

Ansonsten bin ich außerdem auch dankbar dafür wenn mir jemand Tipps gibt das ganze noch besser zu machen, wie ich z.B. das setTimeout mit in die Funktion reinbringen kann anstatt es inline zu machen.

Vielen Dank.

Gruß
 
Hi.

Erstmal bin ich ja begeistert das du ein komplettes Beispiel gemacht hast so das man es ohne Mühe einfach nachvollziehen kann. Das rettet mir den Tag. ;-)

Zu deinem Problem:
Javascript:
window.setTimeout('omout(this)', 900)
Die Funktion aus dem Timeout wird nicht in der aktuellen Umgebung/Closure aufgerufen sondern erst später innerhalb der globalen Umgebung vom window Objekt. Insbesondere bedeutet das, das die spezielle this Variable nicht das Objekt referenziert wo das Ereignis aufgetreten ist, sondern this ist das Window Objekt zu dem die setTimeout Methode schließlich gehört.

Es wird also nicht omout(<a> Tag) sondern omout(window) aufgerufen. Was dann natürlich nicht funktioniert.

Es gibt 2 Möglichkeiten:
HTML:
<a href="#" id="one" onmouseover="omover(this)" onmouseout="window.setTimeout('omout(document.getElementById(\'' + this.id + '\'));', 900)">test</a>

<a href="#" id="two" onmouseover="omover(this)" onmouseout="var self = this; window.setTimeout(function() { omout(self); }, 900)">test</a>
Beim ersten wird das Element nochmal neu ermittelt. Bei der zweiten Variante wird eine anonyme Funktion erstellt, die Zugriff auf alle Variablen ihrer Umgebung hat, ebenfalls auf die self Variable die direkt davor erstellt wurde.

Gruß
 
deepthroat hat gesagt.:
Hi.

Erstmal bin ich ja begeistert das du ein komplettes Beispiel gemacht hast so das man es ohne Mühe einfach nachvollziehen kann. Das rettet mir den Tag. ;-)

Zu deinem Problem:
javascript Code:
  1. window.setTimeout('omout(this)', 900)

Die Funktion aus dem Timeout wird nicht in der aktuellen Umgebung/Closure aufgerufen sondern erst später innerhalb der globalen Umgebung vom window Objekt. Insbesondere bedeutet das, das die spezielle this Variable nicht das Objekt referenziert wo das Ereignis aufgetreten ist, sondern this ist das Window Objekt zu dem die setTimeout Methode schließlich gehört.

Es wird also nicht omout(<a> Tag) sondern omout(window) aufgerufen. Was dann natürlich nicht funktioniert.

Es gibt 2 Möglichkeiten:
HTML:
<a href="#" id="one" onmouseover="omover(this)" onmouseout="window.setTimeout('omout(document.getElementById(\'' + this.id + '\'));', 900)">test</a>

<a href="#" id="two" onmouseover="omover(this)" onmouseout="var self = this; window.setTimeout(function() { omout(self); }, 900)">test</a>
Beim ersten wird das Element nochmal neu ermittelt. Bei der zweiten Variante wird eine anonyme Funktion erstellt, die Zugriff auf alle Variablen ihrer Umgebung hat, ebenfalls auf die self Variable die direkt davor erstellt wurde.

Gruß


Recht herzlichen Dank! Das werde ich gleich mal ausprobieren.
 

Neue Beiträge

Zurück