/ Forside / Teknologi / Udvikling / Java Scripts / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java Scripts
#NavnPoint
molokyle 5410
Klaudi 2799
smorch 2439
kim 1360
Harlekin 1134
bentjuul 984
gibson 800
severino 695
Random 675
10  konsulent.. 626
Parameter i funktionskald i timeout
Fra : tinegade


Dato : 15-08-08 08:42

Jeg vil gerne kunne sende en parameter med funktionskaldet i
timeout'en, f.eks. sådan:

<snip>
var temp;
temp = 2;
testId = setTimeout('testfunc(temp)', 50);
</snip>

-men det har jeg ikke rigtigt held med, kan det ikke lade sig
gøre?

/Tine

--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

 
 
Birger Sørensen (15-08-2008)
Kommentar
Fra : Birger Sørensen


Dato : 15-08-08 10:46

tinegade formulerede fredag:
> Jeg vil gerne kunne sende en parameter med funktionskaldet i
> timeout'en, f.eks. sådan:
>
> <snip>
> var temp;
> temp = 2;
> testId = setTimeout('testfunc(temp)', 50);
> </snip>
>
> -men det har jeg ikke rigtigt held med, kan det ikke lade sig
> gøre?
>
> /Tine

setTimeout er en DOM ting, og defineret til at skulle have evt.
parametre efter delayet.
testid = setTimeout( func, delay, [parametre]);
det virker bare ikke i IE ( iflg Mozilla doc. Jeg har testet...)
http://developer.mozilla.org/en/docs/DOM:window.setTimeout

Alternativet er som du selv prøver at udføre kaldet som en streng.
Skulle vel umiddelbart være godt nok, men der er nok nogle problemer
med at temp ikke bliver brugt som du forestiller dig.
testId = setTimeout( 'testfunc('+temp+')', 50);
skulle vist nok gøre det...
Denne løsning anbefales ikke af Mozilla.

Ellers er der en mulighed for at gøre temp til en global variabel, og
bruge den i testfunc().

Mozilla anbefaler ikke at bruge streng løsningen, mens IE ikke kan
overføre parametre ved pointer løsningen.
Så umiddelbart er eneste rigtige mulighed, at bruge den globale
variable.
Eller een version til hver browser.

Jeg ville nok bruge streng-løsningen på trods af Mozilla, hvis den
virker.

Birger



Lasse Reichstein Nie~ (15-08-2008)
Kommentar
Fra : Lasse Reichstein Nie~


Dato : 15-08-08 17:40

=?ISO-8859-15?Q?Birger_S=F8rensen?= <sdc@bbsorensen.com> writes:

> tinegade formulerede fredag:
>> Jeg vil gerne kunne sende en parameter med funktionskaldet i
>> timeout'en, f.eks. sådan:
>>
>> <snip>
>> var temp;
>> temp = 2;
>> testId = setTimeout('testfunc(temp)', 50); </snip>
>>
>> -men det har jeg ikke rigtigt held med, kan det ikke lade sig
>> gøre?
>>
>> /Tine
>
> setTimeout er en DOM ting, og defineret til at skulle have
> evt. parametre efter delayet.

Ikke i nogen standard-DOM.

> testid = setTimeout( func, delay, [parametre]);
> det virker bare ikke i IE ( iflg Mozilla doc. Jeg har testet...)
> http://developer.mozilla.org/en/docs/DOM:window.setTimeout

Ja, det var oprindelig en Mozilla-specifik udvidelse, som både Opera
og Safari dog har efterlignet. Det virker stadig ikke i IE.

> Alternativet er som du selv prøver at udføre kaldet som en
> streng. Skulle vel umiddelbart være godt nok, men der er nok nogle
> problemer med at temp ikke bliver brugt som du forestiller dig.
> testId = setTimeout( 'testfunc('+temp+')', 50);
> skulle vist nok gøre det...

.... hvis "temp" lavet om til en streng og fortolket igen giver samme
værdi. Det gør det for tal og booleans, men ikke for, fx, strenge.

Eksempel

var temp = "2 + 2 = 4"; // evig sandhed
function func(x) { alert(x); }
setTimeout("func("+temp+")",1000); // sig sandheden ... "true"

> Denne løsning anbefales ikke af Mozilla.

Heller ikke af mig. Lad generelt være med at skrive kode i strenge,
det er noget rod, ligegyldigt om man bruger eval, Function eller
setTimeout til at udføre det.

> Ellers er der en mulighed for at gøre temp til en global variabel, og
> bruge den i testfunc().

(Unødendige) globale variable er også en dårlig ide.

> Mozilla anbefaler ikke at bruge streng løsningen, mens IE ikke kan
> overføre parametre ved pointer løsningen.
> Så umiddelbart er eneste rigtige mulighed, at bruge den globale
> variable.
> Eller een version til hver browser.

Eller bruge en funktion/closure til at gemme referencen til temp
til den skal bruges:

var temp;
temp = 2;
testId = setTimeout(function() { testfunc(temp); }, 50);


> Jeg ville nok bruge streng-løsningen på trods af Mozilla, hvis den
> virker.

"No, no, no. Quicker, easier, more seductive."
Det er vejen til the dark side :)

/L
--
Lasse Reichstein Nielsen
DHTML Death Colors: <URL:http://www.infimum.dk/HTML/rasterTriangleDOM.html>
'Faith without judgement merely degrades the spirit divine.'

Birger Sørensen (15-08-2008)
Kommentar
Fra : Birger Sørensen


Dato : 15-08-08 19:46

Den 15-08-2008, skrev Lasse Reichstein Nielsen:
8X
>
> (Unødendige) globale variable er også en dårlig ide.
>
>> Mozilla anbefaler ikke at bruge streng løsningen, mens IE ikke kan
>> overføre parametre ved pointer løsningen.
>> Så umiddelbart er eneste rigtige mulighed, at bruge den globale
>> variable.
>> Eller een version til hver browser.
>
> Eller bruge en funktion/closure til at gemme referencen til temp
> til den skal bruges:
>
> var temp;
> temp = 2;
> testId = setTimeout(function() { testfunc(temp); }, 50);
>
>
>> Jeg ville nok bruge streng-løsningen på trods af Mozilla, hvis den
>> virker.
>
> "No, no, no. Quicker, easier, more seductive."
> Det er vejen til the dark side :)
>

;>)
Ved godt, man ikke må bruge globale variable - men nu er tingene jo
ikke specielt OOP i almindelig javascript, så det er måske ikke den
helt store forbrydelse.
Din løsning med en funktion der ikke gør andet end at kalde en anden,
lider lidt af samme skavank.
Men elegant, og burde virke hvorsomhelst.

Birger



Lasse Reichstein Nie~ (15-08-2008)
Kommentar
Fra : Lasse Reichstein Nie~


Dato : 15-08-08 23:45

=?ISO-8859-15?Q?Birger_S=F8rensen?= <sdc@bbsorensen.com> writes:

> ;>)
> Ved godt, man ikke må bruge globale variable - men nu er tingene jo
> ikke specielt OOP i almindelig javascript, så det er måske ikke den
> helt store forbrydelse.

Det er ikke så meget den globale variabel, som kode-i-strenge jeg
harcellerer mod. "Eval is evil", etc.

> Din løsning med en funktion der ikke gør andet end at kalde en anden,
> lider lidt af samme skavank.

Den er skam på god teoretisk fundament.

Vi har en funktion (test) som vi vil kalde med en parameter (temp) på
et senere tidspunkt. Derfor tager vi koden for det, test(temp), og
sørger for at den kan kaldes på et senere tidspunt. I.e., vi vil ikke
give funktionen og argumentet til setTimeout, men selve *kaldet* -
pakket ind i en funktion.

> Men elegant, og burde virke hvorsomhelst.

Så længe setTimeout accepterer en funktion som første-argument. Det
gør alle moderne browsere og IE heldigvis. Der er gamle browsere hvor
man kun kan bruge en streng.

/L
--
Lasse Reichstein Nielsen
DHTML Death Colors: <URL:http://www.infimum.dk/HTML/rasterTriangleDOM.html>
'Faith without judgement merely degrades the spirit divine.'

Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408847
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste