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);
}
}
}
}