Avatar billede fojensen Nybegynder
10. maj 2005 - 21:07 Der er 5 kommentarer og
1 løsning

funktioner der kører i ring

Jeg er ikke så erfaren i javascript, så jeg tester gerne efter hver ny linie, for at fange (begynder)fejlen straks...

nedenstående script hvor den ene funktion kalder den anden, og kører i ring som den skal, men kører kun hvis setTimeout'en er placeret i funktionen 'next_step'.

----- test_position.js -----
function next_step(in_tal){
  if (in_tal < 500) {
  out_tal = in_tal + 10
  // run_logo_slide(out_tal) // denne kører ikke
  setTimeout("run_logo_slide(out_tal)", 30) // denne kører fint
  }
}

function run_logo_slide(position_tal){
  document.getElementById('slidecontainer').style.left=position_tal + "px"
  next_step(position_tal) // denne kører fint
  //setTimeout("next_step(position_tal)", 30) // denne kører ikke
}
----- /test_position.js -----

funktionskaldet kommer fra i denne testversion fra <body class="WhiteBody" onload="java script:next_step(0)"> i http://havelykkegaarden.dk/testing//logo/test_havelykkegaarden_logo_position.html

Er der en JavaScript-ekspert der ved hvorfor det kan drille på denne måde - jeg vil gerne lære lidt inden jeg bugger videre (nej, bygger videre) på scriptet...
mvh Folmer
Avatar billede busschou Praktikant
10. maj 2005 - 21:21 #1
Kan du ikke nøjes med en funktion som kalder sig selv?
function next_step(in_tal){
  if (in_tal < 500) {
  out_tal = in_tal + 10
  document.getElementById('slidecontainer').style.left=out_tal + "px"
  setTimeout("next_step(out_tal)", 30)
  }
}
Avatar billede fojensen Nybegynder
10. maj 2005 - 21:32 #2
jo - det kunne jeg måske, men jeg skal gerne have bygget en del mere på, hente næste tekst i array, køre ind igen, sætte ny timer der fastholder den en tid, køre ud igen, næste ind osv. - derfor startede jeg som jeg gjorde...

Du kom ikke ind på spørgsmålet: hvorfor det kan drille på denne måde...
Avatar billede roenving Novice
10. maj 2005 - 21:34 #3
Noget af forklaringen er garanteret, at setTimeouts virker på en anden måde end du forventer !-)

-- en setTimeout sætter en tæller igang, som kører uanset hvad man ellers gør, hvilket vil sige, at anden kode sagtens kan køre mens tælleren kører ...

-- alternativt skyldes det, at variablerne position_tal og out_tal ikke opdateres, da de først fortolkes, når setTimeout-tekststrengen kaldes, hvilket jo sker uden den fjerneste sammenhæng med kaldet ...

-- så måske er løsningen:

----- test_position.js -----
function next_step(in_tal){
  if (in_tal < 500) {
  out_tal = in_tal + 10
  //run_logo_slide(out_tal) // denne kører ikke
  setTimeout("run_logo_slide("+out_tal+")", 30) // denne kører fint
  }
}

function run_logo_slide(position_tal){
  document.getElementById('slidecontainer').style.left=position_tal + "px"
  //next_step(position_tal) // denne kører fint
  setTimeout("next_step("+position_tal+")", 30) // denne kører ikke
}
----- /test_position.js -----
Avatar billede fojensen Nybegynder
10. maj 2005 - 23:07 #4
ja - roenving - din løsning med setTimeout("+variabel+") gør en forskel, og nu hvor jeg bygger videre har jeg også haft brug for udgaver med flere variabler i funktionskaldet som setTimeout("+variabel1+", "+variabel2+").

Tak for svaret - du må gerne smide et svar...
mvh Folmer
Avatar billede roenving Novice
10. maj 2005 - 23:12 #5
Forklaringen på det er, at js åbenbart gemmer hele kaldet som tekst i en buffer, en stak e.l., så det først er på det tidspunkt, timeouten udløber, at teksten fortolkes på samme måde som f.eks. en eval('noget') gør ...

Velbekomme '-)
Avatar billede roenving Novice
11. maj 2005 - 00:37 #6
-- og tak for point ;~}
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