Andreas Dölling: Events und OOP

Beitrag lesen

Hallo,

ich möchte mit einem Controller-Objekt alle Events abfangen und dann an alle Client-Objekte verteilen, die an dem Event interessiert sind.
Der untenstehende Quellcode sollte das rein theoretisch auch tun.
Aaaber: ich habe mit Erstaunen festgestellt, das das Schlüsselwort this in meiner Methode clicked() nicht mehr auf das aktuelle Controller-Objekt zeigt, sondern auf das HTML-Dokument.......
Dementsprechend kann ich innerhalb der Methode auch nicht auf die Attribute und Methoden des Controller-Objekts - also auch nicht auf das clients-Array - zugreifen...

Kennt Ihr dieses Problem?
Und vor allem: habt Ihr einen Tip, wie ich es lösen oder umgehen kann?

Thanx und ciao,
Andreas

Quellcode der Klasse Controller:

// Konstruktor
function Controller () {
 this.clients = new Array();
 this.listening = false;
}

// funktioniert
Controller.prototype.addClient = function (client) {
 this.clients[this.clients.length] = client;
}

// funktioniert
Controller.prototype.listen = function (state) {
 if(state==true && this.listening==false) {
  if (document.addEventListener) {
   document.addEventListener("click", this.clicked, false);
  } else {
   document.onclick = this.clicked;
  }
  this.listening = true;
 } else if (state==false && this.listening==true) {
  if (document.removeEventListener) {
   document.removeEventListener("click", this.clicked, false);
  } else {
   document.onclick = null;
  }
  this.listening = false;
 }
}

// hier tritt das Problem auf
Controller.prototype.clicked = function (event) {
 if (!event) event = window.event;
 alert("this="+this);    // liefert HTMLDocument!!!
 var text = "";
 if (event.srcElement) {
  var srcElement = event.srcElement;
  while(!srcElement.id) {
   srcElement = srcElement.parentNode;
  }

for (var i=0; i<this.clients.length; i++) {
   if(this.clients[i].clickable) {
    this.clients[i].clickable.handle(srcElement.id);
   }
  }
 } else if (event.target) {
  var srcElement = event.target;
  while(!srcElement.nodeType == 1 || !srcElement.id) {
   srcElement = srcElement.parentNode;
  }
  for (var i=0; i<this.clients.length; i++) {
   if(this.clients[i].clickable) {
    this.clients[i].clickable.handle(srcElement.id);
   }
  }
 }

}