OOP: Probleme mit Schlüsselwort this im IE
Andreas Dölling
- javascript
Hallo JS-Freunde,
ich hatte vor einiger Zeit schon einmal ein Problem im Zusammenhang mit OOP und Events in Javascript hier gepostet.
Durch einen sehr guten Hinweis aus der JS-Newsgroup konnte ich das Problem immerhin für Netscape lösen.
Im Internet Explorer bleibt das Problem bestehen: wenn ich einen Event mit einer Methode eines Objektes verarbeiten will, so kann ich innerhalb der Methode zwar wunderbar auf das Event-Objekt zugreifen, aber leider verweist das Schlüsselwort "this" nicht mehr auf das Objekt, dem die Methode gehört.
Ein "alert(this.nodeName);" liefert mir "#document", d.h. "this" verweist nicht mehr auf das aktuelle Objekt, sondern auf das document-Objekt.....
Im Netscape Navigator hatte ich das Problem ursprünglich auch. Mit der Verwendung der Methode handleEvent() konnte ich das Ganze aber lösen - eigentlich ein "dirty trick", aber es klappt - leider aber kennt nur Netscape handleEvent().
Hat jemand von Euch eine Idee?
Danke auf jeden Fall für Euer Interesse!
Ciao,
Andreas
Zur Illustration die relevanten Bereiche meines Quellcodes:
//mit der folgenden Methode wird dem Controller-Objekt gesagt, ob er auf ein Ereignis lauschen soll oder nicht
Controller.prototype.listen = function (state) {
if(state==true && this.listening==false) {
if (document.addEventListener) {
document.addEventListener("click", this, false);
} else {
document.onclick = this.handleEvent;
}
this.listening = true;
} else if (state==false && this.listening==true) {
if (document.removeEventListener) {
document.removeEventListener("click", this, false);
} else {
document.onclick = null;
}
this.listening = false;
}
}
// die Event-Verarbeitung
Controller.prototype.handleEvent = function (event) {
if (!event) event = window.event;
alert ("event.Target");
alert (this.nodeName); // das aktuelle Controller-Objekt hat keine Property nodeName - Netscape liefert korrekterweise einen entsprechenden Fehler, IE spuckt "#document" aus...
alert (this.clients.length); // clients ist eine Property des aktuellen Controller-Objekts - Netscape greift richtig darauf zu, IE nicht...
}