webForumDet fria alternativet

onreadystatechange

JavaScriptur Javascript

7 svar · 573 visningar · startad av Troxy

Medlem sedan mars 20041 505 inlägg
Frågan#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...
}
Medlem sedan juni 20008 205 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)

Medlem sedan mars 20041 505 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.

Medlem sedan mars 20041 505 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...

Medlem sedan juni 20008 205 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.

Medlem sedan mars 20041 505 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.

Medlem sedan jan. 2003296 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..?

Medlem sedan mars 20041 505 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.

260 ms totalt · 3 externa anrop · v20260731065814-full.b746b907
127 ms — hämta forumlista (db)
131 ms — hämta statistik (db)
123 ms — hämta tråd, inlägg och bilagor (db)