webForumDet fria alternativet

Problem med setTimeout

JavaScript

9 svar · 353 visningar · startad av Quazzo

Medlem sedan juli 2001324 inlägg
Frågan#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);
}
Medlem sedan nov. 20017 144 inlägg
#2

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

Medlem sedan juli 2001324 inlägg
#3

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

om det blir nödvändigt.

Medlem 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>
Medlem sedan nov. 20017 144 inlägg
#5

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

Medlem sedan nov. 20017 144 inlägg
#6

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

Medlem sedan juli 2001324 inlägg
#7

Du menar att man ska skriva:

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

Dvs med två enkelfnuttar runt + Id + ?

Medlem sedan nov. 20017 144 inlägg
#8

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

Medlem 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?

Medlem 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

254 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)