Hei, jeg har litt AJAX-relaterte problemer her. Håper noen kan gi litt
innsikt i hvor logikken feiler :)
Jeg ønsker å definere en funksjon for
XmlHttpRequest.onreadystatechange, men ikke in-line - og uten at denne
funksjonen må kjenne til requestobjektet. Såvidt jeg har forstått
legges en brukerdefinert funksjon inn som
XmlHttpRequest.onreadystatechange, slik at funksjonen da "tilhører"
XmlHttpRequest-objektet. Har jeg misforstått? Hvis jeg har rett,
hvorfor fungerer ikke da this-stikkordet inne i denne funksjonen (slik
det gjør ved definisjon av egne klasser)?
Jeg tenkte også at garbage-collection stakk kjepper i hjulene og
lagret request-objektet globalt (uten at onreadystatechange-funksjonen
benyttet denne), men resultatet ble det samme.
Har forsøkt å illustrere hva jeg ønsker å gjøre under.
function processResponse() {
if(this.readyState == 4) { //this.readyState er undefined!
//...
}
}
function getRequest() {
//...
}
function sendRequest(responseFunction, parameters) {
var request = getRequest();
request.onreadystatechange = responseFunction;
request.open("POST", "url", true);
request.setRequestHeader('Content-Type', 'application/x-www-form-
urlencoded');
request.send(parameters);
}
sendRequest(processResponse, "");
---
Ved definisjon av klasser, fungerer dette utmerket::
function MyClass() {
this.x = 5;
this.getX = myClassGetX;
}
function myClassGetX() {
return this.x;
}
--
Are Nybakk
Jeg fikk noe klarhet i det til slutt. Problemet, som jeg har skjønt
det, er at this-nøkkelordet er avhengig av hvordan en metode kalles.
Det kan variere hvordan ajax-objektet gjør dette.
Løsningen er å gjøre som følger (takk til Tom Cole):
request.onreadystatechange = function() {
responseFunction(request);
}
Da benytter metoden referansen "request" framfor this-nøkkelordet.