Avatar billede jegharetproblem Nybegynder
31. marts 2001 - 21:58 Der er 20 kommentarer og
1 løsning

Problem med this pointer i window.setInterval()

Mit problem er forklaret og demonstreret på engelsk her:

http://212.242.222.71/problem.htm

Siden kan ikke ses i NS4 da jeg bruger innerHTML.

Den er en forenkling af en anden side med samme problem, og har ingen nyttig funktion andet end at demonstrere problemet.

Jeg har fundet en work-around på problemet, men den er ikke rigtig i OOP-ånden, og da jeg netop ville objekt orientere min kode, vil jeg helst undgå den løsning.

Her er koden:

<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">
<HTML>
<HEAD>
<TITLE></TITLE>
<STYLE TYPE=\"text/css\">
<!--
BODY {background-color: #FFFFFF; font-family: Verdana, sans-serif; font-size: 8pt}
-->
</STYLE>
<SCRIPT LANGUAGE=\"javascript\" TYPE=\"text/javascript\">
<!--
function startWritingMsg(){
  document.body.innerHTML += this.myProperty + \" - this works fine outside the setInterval method<BR>\"
  this.hTimer = window.setInterval(\"document.body.innerHTML += this.myProperty + \'<BR>\'\",1000);
}

function myObject(){
  this.myProperty = \"Hello World\";
  this.startWrite = startWritingMsg;
}

var obj = new myObject();
//-->
</SCRIPT>
</HEAD>
<BODY>
<A HREF=\"\" ONCLICK=\"obj.startWrite();return false\">Start writing</A>
- this was supposed to write the myProperty string to the body every second...
The problem is that when inside the setInterval method of the window object,
\'this\' suddenly points to the window object instead of the custom \'myObject\'.
Is it possible to use the \'this\' pointer in this situation at all?
<BR><BR>
</BODY>
</HTML>

Jeg håber det er iorden med folk at jeg ikke har fået oversat teksten - hvis der er problemer vil jeg hjertens gerne forklare situationen på danmarksk.

Den workaround jeg snakkede om, var at gemme \'this\'-pointeren i en global variabel inden window.setInterval() kaldes, sådan her:

var objVar; //deklareret globalt

function startWritingMsg(){
  document.body.innerHTML += this.myProperty + \" - this works fine outside the setInterval method<BR>\"
  objVar = this;
  this.hTimer = window.setInterval(\"document.body.innerHTML += obj.myProperty + \'<BR>\'\",1000);
}

Det virker, men det er ikke kønt... =)

På forhånd tak for hjælpen.
Avatar billede jegharetproblem Nybegynder
31. marts 2001 - 22:02 #1
En rettelse til workaround kodestumpen i bunden - koden skal se sådan her ud istedet:

var objVar; //deklareret globalt

function startWritingMsg(){
  document.body.innerHTML += this.myProperty + \" - this works fine outside the setInterval method<BR>\"
  objVar = this;
  this.hTimer = window.setInterval(\"document.body.innerHTML += objVar.myProperty + \'<BR>\'\",1000);
}

Så kan i selv more jer med at finde forskellen =)
Avatar billede jakoba Nybegynder
31. marts 2001 - 22:22 #2
this  er contextsensitiv. setTnterval starter strengen i dit vindues context istedet for i funktions.
for at få det til at virke skal du \"bygge\" strengen sp this bliver evalueret før strengen lagres:

  this.hTimer = window.setInterval(\"document.body.innerHTML += \"
                                  +this.myProperty + \"\'<BR>\'\",1000);

mvh JakobA
Avatar billede dudal Nybegynder
31. marts 2001 - 22:29 #3
function startWritingMsg(){
  document.body.innerHTML += obj.myProperty + \" - this works fine outside the setInterval method<BR>\"
  this.hTimer = window.setInterval(\"document.body.innerHTML += obj.myProperty + \'<BR>\'\",1000);
}

Avatar billede jakoba Nybegynder
31. marts 2001 - 22:32 #4
Eller hvis indholdet af myProperty skal kunne opdateres så brug din objVar  variabel som ovenfor.

Avatar billede jakoba Nybegynder
31. marts 2001 - 22:42 #5
Men hvis det er OOP du er ude efter så er det da bedre med:

function startWritingMsg(){
  document.body.innerHTML += this.myProperty + \" - this works fine outside the setInterval method<BR>\"
  this.hTimer = window.setTimeout(\"obj.startWrite()\",1000);
};

Avatar billede jegharetproblem Nybegynder
31. marts 2001 - 23:07 #6
jakoba >> dit forslag virker ikke, eller også har bøffet i den - gider du checke http://212.242.222.71/problem.htm og se om det var sådan du mente?
Avatar billede jakoba Nybegynder
31. marts 2001 - 23:14 #7
det var sådan jeg mente, men jeg tænkte mig ikke ordentlig om:

\"document.body.innerHTML += \" +this.myProperty + \"\'<BR>\'\"
bliver lagt sammen til:
document.body.innerHTML += Hello World\'<BR>\'\"
og så mangler der et semikolon efter hello :(

  this.hTimer = window.setInterval(\"document.body.innerHTML += \'\"
                                  +this.myProperty + \"<BR>\'\",1000);

så skulle den være der.

mvh JakobA
Avatar billede jegharetproblem Nybegynder
31. marts 2001 - 23:22 #8
jakoba >> nevermind - har fået det til at virke, endelig! Det du foreslog virkede ikke rigtigt til at begynde med:

this.hTimer = window.setInterval(\"document.body.innerHTML += \" + this.myProperty + \"\'<BR>\'\",1000);

Efter lidt langsom dagen-derpå hjerne arbejde (alt for mange anførselstegn og apostroffer for mit lille hoved), fandt jeg frem til løsningen:

this.hTimer = window.setInterval(\"document.body.innerHTML += \'\" + this.myProperty + \"\'+\'<BR>\'\",1000);

Find to fejl!

Det var selvfølgelig også det du mente, og eftersom dit indlæg førte til løsningen får du også de 300 spir.

Velbekomme!

Avatar billede jegharetproblem Nybegynder
31. marts 2001 - 23:23 #9
jakoba >> heller ikke helt rigtigt =) - kig ovenover...hehe
Avatar billede jakoba Nybegynder
31. marts 2001 - 23:24 #10
takker og bukker. (men tror nu ikke du har brug for det \'+\' foran <br>)
Avatar billede jegharetproblem Nybegynder
31. marts 2001 - 23:28 #11
jakoba >> undskyld - min fejl (pinligt)
Avatar billede jegharetproblem Nybegynder
31. marts 2001 - 23:32 #12
jakoba >> har du så en ide hvis det der skal kaldes fra setInterval er en metode af \'this\' istedet for en property?

ex:

window.setInterval(this.metode,1000);

Der er ingen point for det (jeg er broke)...
Avatar billede jakoba Nybegynder
31. marts 2001 - 23:46 #13
Det er okay. du har spyttet rigeligt i kassen.
jeg tror du mener de jeg snakkede om ovenfor (31/03 2001 22:42:05)
altså:
window.setInterval(\"obj.metode()\",1000);

For at gøre  this  til en brugbar parameter indeni sådan en streng (der først bliver evalueret efter funktionens context er dødt) skulle vi lave en version af setInterval der kørte *indeni* objektet (eller i det mindste startede eval( ... ) indeni objektet. det er jeg ikke rigtig godt nok inde i det til at ku.

lidt gæt der sikkert er galt:

function myObject(){
  this.myProperty = \"Hello World\";
  this.startWrite = startWritingMsg;
  this.setInteval = setInterval; <!-- måske endda ulovligt -->
}

this.setInterval(\"this.metode()\",1000);

men hvis du har energi til at prøve...

mvh JakobA

Avatar billede jakoba Nybegynder
31. marts 2001 - 23:58 #14
kikkede i manualen. Det er faktisk meget muligt at din

window.setInterval(this.metode,1000);

virker uden problemer. Her kan  this.metode  jo preevalueres til en pegepind til metoden (i hvilket objekt den så ligger).
Avatar billede jakoba Nybegynder
01. april 2001 - 00:11 #15
Næe, den eneste jeg får til at virke virke er:
window.setTimeout(\"obj.metode()\",1000);
Avatar billede jegharetproblem Nybegynder
01. april 2001 - 00:19 #16
jakoba >> jeg fik mobiliseret lidt energi, godt inspireret af din gode ide, men det virker desværre ikke af en eller anden grund tilhører this.setInterval stadig window objektet...

check min side, hvor jeg har sat den til at udskrive this.location.href - noget den jo kun kan gøre hvis den tilhører window objektet...
Avatar billede jegharetproblem Nybegynder
01. april 2001 - 00:21 #17
jakoba >> jeg skal huske at opdatere siden noget oftere, eller lade være med at holde så lange pauser når jeg skriver, hvis vi skal holde en samtale kørende =)
Avatar billede jegharetproblem Nybegynder
01. april 2001 - 00:29 #18
jakoba >> jeg har prøvet det - check min side http://212.242.222.71/problem.htm hvor jeg har lavet en ny funktion.

Ingen af de to metoder fungerer...(snøft)

hverken

window.setInterval(this.metode,1000);

eller

window.setInterval(\"this.metode()\",1000);

noen ideer...?
Avatar billede jegharetproblem Nybegynder
01. april 2001 - 00:35 #19
jakoba >> jeg er jo bare tilbage ved det samme problem, at this peger til window inde i setInterval...

Forresten til din kommentar kl. 22:42:05 om OOP - jeg kan da ikke bare bruge obj objektet direkte, pointen er jo at jeg skal have flere instances en én af min klasse, hva så med dem?
Avatar billede jegharetproblem Nybegynder
01. april 2001 - 00:38 #20
jakoba >> nå du, jeg vil gå til ro - så må jeg checke ind imorgen og se om du har løst gåden...

Tak for al din hjælp under alle omstændigheder.

Hej
Avatar billede jakoba Nybegynder
01. april 2001 - 01:27 #21
ikke ligefremt kønt, men det virker: (IE only)
http://hjem.get2net.dk/Jakob.Aggernaes/temp/exp61202.html
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester