webForumDet fria alternativet

onreadystatechange

7 svar · 573 visningar · startad av Troxy

TroxyMedlem sedan mars 20041 508 inlägg
#1

Hejsan.
Jag undrar lite hur det här med event handlers fungerar.
Ett XmlHttpRequest-objekt har ju "onreadystatechange" som kan köra en funktion varje gång "readyState" ändras.

Jag håller på och bygger en sorts "Ajax"-class. Där använder jag XmlHttpRequest inuti min class.
Ni vill jag köra en av classens funktioner när "onreadystatechange" triggas.

Men jag upptäckte att jag längre inte kan komma åt själva classens egenskaper när funktionen körs, dvs. "this" refererar inte till classen längre utan till själva funktionen som körs...antar jag?

Ska jag binda själva funktionen till "onreadystatechange" på något speciellt sätt?

Hoppas någon förstår vad jag vill åstakomma.
Här är i alla fall en väldigt förenklad kod:

function myObject()
{
	this.myValue=32;
	this.myFunction = function(){alert(this.myValue)};

	//...här skapas ett XmlHttpRequest osv...

	xmlhttp.onreadystatechange = ? //Här vill jag att myFunction() ska köras

	xmlhttp.open...
}
spangoMedlem sedan juni 20006 147 inlägg
#2

onreadystatechange är ju en metod i xmlhttp, så this syftar på xmlhttp och inte myObject-instansen. Ger du xmlhttp en referens till myObject går det bättre.

function myObject()
{
	this.myValue=32;
	this.myFunction = function(){alert(this.myValue)};

	//...här skapas ett XmlHttpRequest osv...
	xmlhttp.myObjectReference = this;
	xmlhttp.onreadystatechange = function () { this.myObjectReference.myFunction(); }
	xmlhttp.open...
}

(otestat, varning för buggar)

TroxyMedlem sedan mars 20041 508 inlägg
#3

Hm, jag får det inte riktigt att fungera.
Firefox felkonsol säger "this.myObjectReference has no properties" när "onreadystatechange" inträffar.

Jag testade även att göra såhär:

xmlhttp.onreadystatechange = function () { alert(this); };

Då får jag en alert-ruta som säger:

function () {
alert(this);
}

...vilket jag tolkar som att "this" i detta fall referar till själva funktionen och inte xmlhttp-objektet.

TroxyMedlem sedan mars 20041 508 inlägg
#4

Efter att ha läst på lite, bland annat denna artikel så vill jag påstå att "onreadystatechange" inte fungerar på samma sätt som andra "vanliga" events, i alla fall inte i Firefox.

Jämför följande två kodexempel:

window.onclick = function(){alert(this)}; //this refererar här till window-objektet
xmlhttp.onreadystatechange = function(){alert(this)}; //this refererar här till själva funktionen, och INTE xmlhttp-objektet

Nu är jag väldigt förvirrad faktiskt...

spangoMedlem sedan juni 20006 147 inlägg
#5

Då är vi två, men det ska inte hindra oss. Vi sätter this:en som en referens hos funktionen istället för hos xmlhttp.

function myObject()
{
	this.myValue=32;
	this.myFunction = function(){alert(this.myValue)};

	//...här skapas ett XmlHttpRequest osv...
	xmlhttp.onreadystatechange = function () { this.myObjectReference.myFunction(); }
	xmlhttp.onreadystatechange.myObjectReference = this;
	xmlhttp.open...
}

Förutsatt att det funkar likadant i alla browsers.

TroxyMedlem sedan mars 20041 508 inlägg
#6

spango, tyvärr så verkar det inte fungera likadant i alla webbläsare.
I Opera och Safari och så verkar "this" referera till XmlHttpRequest-objektet i funktionen som man sätter i "onreadystatechange". (Precis som jag tycker att det borde fungera i alla webbläsare).
Jag tror att jag är en lösning på spåret nu, postar en färdig kod lite senare.

Förresten, XmlHttpRequest är nu så otroligt trendigt idag så det borde väl finnas fler som uppmärksammat detta? Kanske finns det någon artikel? Sökte lite men hittade inte så mycket.

jawbreakerMedlem sedan jan. 2003294 inlägg
#7
function myObject()
{
	var _this = this;

	this.myValue=32;
	this.myFunction = function(){alert(this.myValue)};

	//...här skapas ett XmlHttpRequest osv...

	xmlhttp.onreadystatechange = function() { _this.myFunction(); }

	xmlhttp.open...
}

bör fungera..?

TroxyMedlem sedan mars 20041 508 inlägg
#8

jawbreaker, tack det där var lösningen. :)
Att lägga classen i en variabel först och sedan använda den verkar fungera perfekt.

Genererad på 384 ms · cache AV · v20260730165559-full.f96bc7eb