Ajax-Klasse verliert this-operator
Stefan
- javascript
Hi,
ich habe ein kleines JS-Problem. Ich habe folgende Klasse mit den folgenden Funktionen geschrieben:
function cAjax(){
this.request = null;
this.interpretRequest = function() {
//this-operator zeigt auf ein falsches Objekt
}
this.sendRequest = function(url, method, qstr){
// XMLHttpRequest-Objekt wird erstellt und in this.request gespeichert
// ...
this.request.onreadystatechange = this.interpretRequest;
// ...
// Request wird gesendet
}
}
Die Klasse an sich funktioniert wunderbar. Das XMLHttpRequest-Objekt wird erstellt, der Request liefert ein Ergebnis zurück usw. Innerhalb der Funktion interpretRequest zeigt der this-operator nicht auf meine cAjax-Klasse, sondern auf ein anderes Objekt. Vermutlich ein browserinternes Objekt, welches die Funktion interpretRequest aufruft.
Ich bin gerade ziemlich am verzweifeln. Hat vielleicht jemand eine Idee, wie ich dieses Problem umgehen kann?
Vielen Dank
Stefan
Hallo,
Der readystatechange-Handler interpretRequest wird nicht im Kontext der cAjax-Instanz ausgeführt, deswegen zeigt this auch nicht auf die Instanz. Das Problem findest du unter http://aktuell.de.selfhtml.org/artikel/javascript/organisation/#object-methoden-und-kontext beschrieben, dort werden auch Lösungen vorgestellt. Man legt z.B. eine Variable an, die auf die Instanz zeigt und die dann im Handler angesprochen wird:
function cAjax () {
var cAjaxInstanz = this;
this.interpretRequest = function() {
alert(cAjaxInstanz);
};
...
this.request.onreadystatechange = this.interpretRequest;
...
}
Mathias
Hallo,
Der readystatechange-Handler interpretRequest wird nicht im Kontext der cAjax-Instanz ausgeführt, deswegen zeigt this auch nicht auf die Instanz. Das Problem findest du unter http://aktuell.de.selfhtml.org/artikel/javascript/organisation/#object-methoden-und-kontext beschrieben, dort werden auch Lösungen vorgestellt. Man legt z.B. eine Variable an, die auf die Instanz zeigt und die dann im Handler angesprochen wird:
function cAjax () {
var cAjaxInstanz = this;
this.interpretRequest = function() {
alert(cAjaxInstanz);
};
...
this.request.onreadystatechange = this.interpretRequest;
...
}
>
> Mathias
Danke für die Hilfe. Oh man darauf hätte ich auch kommen können. Sowas passiert, wenn man stundenlang auf denselben Code schaut...
Stefan