webForumDet fria alternativet

Problem med setTimeout

9 svar · 351 visningar · startad av Quazzo

QuazzoMedlem sedan juli 2001324 inlägg
#1

Har en funktion hideLayer som jag anropar:

function delay(Id){
	timerID = setTimeout("hideLayer('org')",1000);
}

Fungerar bra, men när jag däremot vill ta med mig variabeln Id in i funktionen hideLayer så fungerar det inte?

function delay(Id){
	timerID = setTimeout("hideLayer(Id)",1000);
}
Jesper TMedlem sedan nov. 20017 144 inlägg
#2

vad är "timerID"? Det ända du gör är väl att sätta en variabel?

QuazzoMedlem sedan juli 2001324 inlägg
#3

Bara en variabel så jag senare kan köra en
clearTimeout(timerID);

om det blir nödvändigt.

Jesper TMedlem sedan nov. 20017 144 inlägg
#4

Detta funkar för mig:

 <script>
function delay(Id){
setTimeout('hideLayer(\''+Id+'\')', 1000);

}
function hideLayer(Id){
document.getElementById(Id).style.display='none';	
}
</script>
Jesper TMedlem sedan nov. 20017 144 inlägg
#5

Dj-vlar, forumet gör om kåden.

Jesper TMedlem sedan nov. 20017 144 inlägg
#6

setTimeout('hideLayer(\_''+Id+'\_')', 1000);
Utan underscore!

QuazzoMedlem sedan juli 2001324 inlägg
#7

Du menar att man ska skriva:

setTimeout('hideLayer(''+Id+'')', 1000);

Dvs med två enkelfnuttar runt + Id + ?

Jesper TMedlem sedan nov. 20017 144 inlägg
#8

Så som jag skrivit (enkelfnutt,hideLayer(,backslash,enkelfnutt,enkelfnutt, + Id +, enkelfnutt, backslash, enkelfnutt,), enkelfnutt, komma 1000);

QuazzoMedlem sedan juli 2001324 inlägg
#9

Oki, nu fungerar det bra, tack för hjälpen!

För att få med sig en variabel vidare till en funktion använder man sig alltså av
\'' + variabelnamn + '\'

Slutet är inte helt logiskt, men det är klar allt är inte logiskt första gången man gör det. Har du/ni något bra länktips som beskriver detta med variabler i funktioner?

magnus_fossumMedlem sedan juli 200338 inlägg
#10

Re: Variabel till variabel

Tjenare!

Jag tror att förklaringen är denna:

Metoden setTimeout(kodsträng,msek) innebär att kodsträngen exekveras först efter msek millisekunder. Javascript-tolken VÄNTAR INTE vid denna instruktion utan fortsätter exekvera eventuella efterföljande instruktioner i funktionen och hinner sannolikt lämna densamma innan sas. "tiden rinner ut". Mao. så anropas inte funktionen hideLayer från funktionen delay. Eftersom Id är en LOKAL variabel så är den inte definierad utanför funktionen delay.

Beroende på omständigheterna så kunde en annan lösning vara att ha en global motsvarighet till variabeln, global_Id, och skriva funktionen som

var global_Id
 .
 .
 .
function delay(Id){
	global_Id = Id // garanterar att argumentet till 
	               // hideLayer är definierat vid anropet
 	timerID = setTimeout("hideLayer(global_Id)",1000);
}

eller att skippa den lokala variabeln helt och hållet:

var global_Id
 .
 .
 .
function delay(){
	timerID = setTimeout("hideLayer(global_Id)",1000)
}

Båda dessa varianter förutsätter dock att du inte behöver ändra på variabeln global_Id (tex för ett annat anrop av funktionerna) innan timeoutkoden skall exekveras.

Magnus

131 ms totalt · 3 externa anrop · v20260731065814-full.beb2e261
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)