Avatar billede koch Nybegynder
14. december 2003 - 22:41 Der er 31 kommentarer og
1 løsning

Funktion der kaldes i en anden funktion

Jeg skal have en funktion Shift(); som skal oprettes 'for(i=0;i<biler.length;i++)'. Det skal naturligvis nævnes at jeg har et array som hedder 'biler' Derefter kaldes funktionen Shift(); i
en anden funktion Print(); som udføres 'for (i=0; i<8; i++)'. Print(); opretter en <table> hvori der nogle billeder.
Ved klik på hvert billede skal funktionen Shift(); kaldes. Dvs. hvis Print(); har oprettet et billede 'for i=1', så skal
Shift(); som er oprettet 'for i=1' kaldes.
Jeg vil meget gerne have hjælp til at oprette Shift();

Det basale i funktionen ser således ud:

    function Shift(){
        imgStart=parseInt(biler[i].split("*")[6]);
        imgNum=imgStart;
        imgEnd=imgStart+4; 
          imgNum++
          if (imgNum==imgEnd)
              {imgNum=imgStart}
              document.bil_"+biler[i].split("*")[5]+".src=img["+imgNum+"].src
          }
        }


- det ses at 'biler[i].split("*")[6]' og 'biler[i].split("*")[5]' er værdier fra mit array 'biler'


Hvordan opretter jeg Shift(); således at der er en funktion Shift(); 'for(i=0;i<biler.length;i++)'
som jeg kan kalde ved f.eks. at skrive Shift[i](); i min Print();-funktion.





Eksempel:
For den gennemgang af Print(); hvor i=1
skal jeg ved at klikke på det billede der er oprettet af Print(); kalde Shift(); for i=1.


Jeg har det hele på nær en Shift();-funktion der virker ;o)
Avatar billede olebole Juniormester
15. december 2003 - 02:15 #1
<ole>

Jeg har svært ved at hjælpe dig, da jeg ikke forstår, hvad det præcis er, du ønsker. Det lyder dog helt galt at oprette mange funktioner

/mvh
</bole>
Avatar billede koch Nybegynder
15. december 2003 - 20:51 #2
Jeg har en funktion, der bl.a. indeholder følgende:

function printCar1(){
txt="";
for (i=0; i<8; i++){
txt+="<td><a href=\"java script:imgShift();\"><img src=\"Pics/"+biler[i].split("*")[0]+"/IMAGE001.jpg\" name=\"bil_"+biler[i].split("*")[5]+"\"></a>}
document.write("<tr>"+txt+"</tr>")
}

Deri indgår imgShift();, som er mit problem. Jeg har brug for en funktion imgShift(); som kan antage forskellige værdier for hver gang imgShift(); kaldes. 
Dette:
<td><a href=\"java script:imgShift();\"><img src=\"Pics/"+biler[i].split("*")[0]+"/IMAGE001.jpg\" name=\"bil_"+biler[i].split("*")[5]+"\"></a>}

oprettes for (i=0; i<8; i++).

imgShift skal udføres med forskellige værdier for hver gennemgang af printCar1. Så når jeg klikker på billedet for at kalde imgShift(); på det billede der er oprettet for i=1 i printCar1(); så skal
imgShift se sådan ud:

function imgShift(){
        imgStart=parseInt(biler[1].split("*")[6]);
        imgNum=imgStart;
        imgEnd=imgStart+4; 
          imgNum++
          if (imgNum==imgEnd)
              {imgNum=imgStart}
              document.bil_"+biler[1].split("*")[5]+".src=img["+imgNum+"].src
          }
        }

Er dette forståeligt?
Avatar billede olebole Juniormester
15. december 2003 - 20:58 #3
Jamen, så skriver du vel bare et argument ind i funktionskaldet:
  <a href=\"java script:imgShift();\">
bliver f.eks. til:
  <a href=\"java script:imgShift("+i+");\">
eller hvordan du nu vil overføre værdier.
Avatar billede koch Nybegynder
15. december 2003 - 21:14 #4
Men dette skulle være muligt?

function imgShift(){
        imgStart=parseInt(biler[1].split("*")[6]);
        imgNum=imgStart;
        imgEnd=imgStart+4; 
          imgNum++
          if (imgNum==imgEnd)
              {imgNum=imgStart}
              document.bil_"+biler[1].split("*")[5]+".src=img["+imgNum+"].src
          }
        }

Jeg får fejl i denne linie 'document.bil_"+biler[1].split("*")[5]+".src=img'

';' var ventet
Avatar billede olebole Juniormester
15. december 2003 - 21:22 #5
Prøv:
  document.images["bil_"+biler[1].split("*")[5]].src=img["+imgNum+"].src
Avatar billede koch Nybegynder
15. december 2003 - 21:40 #6
Det hjalp en smule!
Jeg får nu:
'img.+imgNum+.src' er null eller ikke et objekt.

Jeg har [] omkring "+imgNum+" fordi jeg skal have fat i billeder der er oprettet vha. :

var img=new Array();
        for (i=0;i<biler.length; i++){
          for (j=0;j<=4;j++)
          {
          img[parseInt(biler[i].split("*")[6])+j] = new Image();
          img[parseInt(biler[i].split("*")[6])+j].src="Pics/"+biler[i].split("*")[0]+"/IMAGE00"+(j+1)+".JPG";
          }
        }

Så de hedder jo img[et tal].src
Avatar billede olebole Juniormester
15. december 2003 - 21:52 #7
Tjah ... jeg kan jo ikke se, om tallene holder - men du skal sørge for, at array'et 'img' er erklæret _udenfor_ funktionerne
Avatar billede koch Nybegynder
15. december 2003 - 21:57 #8
Tallene holder! Arrayet er erklæret udenfor funktionerne(altså udenfor imgShift(); og printCar1(); hvis det er disse du mener?)

Er det til at sige hvorfor så jeg får fejlen ovenfor når: 'img.+imgNum+.src' er null eller ikke et objekt
Avatar billede olebole Juniormester
15. december 2003 - 22:36 #9
Jamen, selvfølgelig ... det er da også noget gudsjammerligt vrøvl  :oP

  document.images["bil_"+biler[1].split("*")[5]].src=img[imgNum].src
Avatar billede koch Nybegynder
15. december 2003 - 23:14 #10
Gudsjammerligt vrøvl, lad os kalde det det ;o)
Det 'begynder' at hjælpe ;o)
Funktionen ser nu sådan ud:

    function imgShift(){
      for(i=0;i<8;i++){
        imgStart=parseInt(biler[i].split("*")[6]);
        imgNum=imgStart;
        imgEnd=imgStart+4; 
          imgNum++
          if (imgNum==imgEnd)
              {imgNum=imgStart}
              document.images["bil_"+biler[i].split("*")[5]+""].src=img[imgNum].src
          }
        }

Og den kaldes med imgShift(i);. Problemet er nu at når jeg klikker på et billede, så er det allesammen der skifter! Er deten mulighed at sætte  'for(i=0;i<8;i++)' udenfor funktionen og oprette funktionen i et array i stedet?
Avatar billede koch Nybegynder
15. december 2003 - 23:23 #11
Jeg har forsøgt med:
    function imgShift(){
        imgStart=parseInt(biler[i].split("*")[6]);
        imgNum=imgStart;
        imgEnd=imgStart+4; 
          imgNum++
          if (imgNum==imgEnd)
              {imgNum=imgStart}
              document.images["bil_"+biler[i].split("*")[5]+""].src=img[imgNum].src
        }


også, men der får jeg 'document.images[...]' er null eller ikke et objekt!
Avatar billede koch Nybegynder
15. december 2003 - 23:26 #12
Det gør ingen forskel om jeg kalder funktionen med imgShift(i) eller bare imgShift() når imgShift ser ud som i 'Kommentar: koch
15/12-2003 23:14:11'
Avatar billede olebole Juniormester
16. december 2003 - 00:08 #13
i'et var blot et eksempel på at du kan sende nogle argumenter med kaldet. Med dem kan du styre, hvad der skal ske, hvor. Hvad du skal sende med, ved du vist kun selv
Avatar billede koch Nybegynder
18. december 2003 - 20:50 #14
Ok. Hvis jeg skal bruge imgShift(); hvor 'i' antager forskellige værdier er det så bare at kalde med imgShift(i); i funktionen printCar1. Altså:

function printCar1(){
txt="";
for (i=0; i<8; i++){
txt+="<td><a href=\"java script:imgShift(i);\"><img src=\"Pics/"+biler[i].split("*")[0]+"/IMAGE001.jpg\" name=\"bil_"+biler[i].split("*")[5]+"\"></a>}
document.write("<tr>"+txt+"</tr>")
}

Jeg har en <table> hvori billederne fra printCar1(); oprettes. Når jeg klikker på et af billederne(og kalder imgShift();) så udføres funktionen på alle billederne og det er jo ikke meningen. Funktionen skal kun kaldes på det billede hvor name=\"bil_"+biler[i].split("*")[5]+"\".

Vil det være lettere at oprette et array hvor der oprettes 'i' antal funktioner imgShift[i](); og så kalde den pågældende funktion i printCar1(); sådan(hvis man kan oprette array med funktioner altså):

function printCar1(){
txt="";
for (i=0; i<8; i++){
txt+="<td><a href=\"java script:imgShift[i]();\"><img src=\"Pics/"+biler[i].split("*")[0]+"/IMAGE001.jpg\" name=\"bil_"+biler[i].split("*")[5]+"\"></a>}
document.write("<tr>"+txt+"</tr>")
}
Avatar billede roenving Novice
18. december 2003 - 21:10 #15
Nej, du skal bare i din funktion bruge en parameter, måske to, så du ved hvilken bil og hvilken anden ting, du vil have fat i !-)
Avatar billede koch Nybegynder
18. december 2003 - 21:29 #16
Er det så ikke nok bare at benytte 'i' når imgShift(); kaldes, altså imgShift(i);
Vil det ikke give det ønskede:

function printCar1(){
txt="";
for (i=0; i<8; i++){
txt+="<td><a href=\"java script:imgShift(i);\"><img src=\"Pics/"+biler[i].split("*")[0]+"/IMAGE001.jpg\" name=\"bil_"+biler[i].split("*")[5]+"\"></a>}
document.write("<tr>"+txt+"</tr>")
}

Vil det så ikke svare til at imgShift(i) så kaldes med de forskellige værdier af 'i', altså (i=0; i<8; i++).

Så når i=2 f.eks. så ser imgShift(2); således ud:

    function imgShift(){
        imgStart=parseInt(biler[2].split("*")[6]);
        imgNum=imgStart;
        imgEnd=imgStart+4; 
          imgNum++
          if (imgNum==imgEnd)
              {imgNum=imgStart}
              document.images["bil_"+biler[2].split("*")[5]+""].src=img[imgNum].src
        }
Avatar billede roenving Novice
18. december 2003 - 21:31 #17
jow ...

    function imgShift(num){
        imgStart=parseInt(biler[num].split("*")[6]);
        imgNum=imgStart;
        imgEnd=imgStart+4; 
          imgNum++
          if (imgNum==imgEnd)
              {imgNum=imgStart}
              document.images["bil_"+biler[num].split("*")[5]+""].src=img[imgNum].src
        }
Avatar billede koch Nybegynder
18. december 2003 - 21:39 #18
Så får jeg desværre at vide: 'document.images[...]' er null eller ikke et objekt

Og hvad hulen er nu det for noget ;o)
Avatar billede koch Nybegynder
18. december 2003 - 22:22 #19
Min funktion ser præcis sådan ud:
  function imgShift(i){
        imgStart=parseInt(biler[i].split("*")[6]);
        imgNum=imgStart;
        imgEnd=imgStart+4; 
          imgNum++
          if (imgNum==imgEnd)
              {imgNum=imgStart}
              document.images["bil_"+biler[i].split("*")[5]+""].src=img[imgNum].src
}

Og kaldes med:

function printCar1(){
txt="";
for (i=0; i<8; i++){
txt+="<td><a href=\"java script:imgShift(i);\"><img src=\"Pics/"+biler[i].split("*")[0]+"/IMAGE001.jpg\" name=\"bil_"+biler[i].split("*")[5]+"\"></a>}
document.write("<tr>"+txt+"</tr>")
}
Avatar billede koch Nybegynder
18. december 2003 - 22:37 #20
Ok, nu er den der næsten:

  function imgShift(i){
        imgStart=parseInt(biler[i].split("*")[6]);
        imgNum=imgStart;
        imgEnd=imgStart+4; 
          imgNum++
          if (imgNum==imgEnd)
              {imgNum=imgStart}
              document.images["bil_"+biler[i].split("*")[5]+""].src=img[imgNum].src
}

Og kaldes med:

function printCar1(){
txt="";
for (i=0; i<8; i++){
txt+="<td><a href=\"java script:imgShift("+i+");\"><img src=\"Pics/"+biler[i].split("*")[0]+"/IMAGE001.jpg\" name=\"bil_"+biler[i].split("*")[5]+"\"></a>}
document.write("<tr>"+txt+"</tr>")
}

Men nu virker funktionen kun ved første klik på billedet! Jeg skifter billedet ud ved hvert klik, men det skifter kun første gang!
Giver alt i denne ikke mening?

function imgShift(i){
        imgStart=parseInt(biler[i].split("*")[6]);
//imgStart sættes lig tallet som den pågældende bils billede-sti har

        imgNum=imgStart;
//imgNum tildeles værdien for imgStart

        imgEnd=imgStart+4; 
imgEnd sættes lig den værdi som imgStart får når der er klikket 4 gange på billedet

          imgNum++
//der lægges en til imgNum for hver gang funktionen udføres

          if (imgNum==imgEnd)
//hvis imgNum er lig imgEnd, altså hvis der er klikket 4 gange på billedet så

              {imgNum=imgStart}
sættes imgNum lig imgStart, dvs. man kan begynde forfra med klikke på billedet
         
  document.images["bil_"+biler[i].split("*")[5]+""].src=img[imgNum].src
}
//det billede som klikkes på skifter til det billede der er gemt i billedstien bestemt udfra imgNum
Avatar billede roenving Novice
18. december 2003 - 23:18 #21
function imgShift(i){
        imgStart=parseInt(biler[i].split("*")[6]);
//imgStart sættes lig tallet som den pågældende bils billede-sti har

        imgNum=imgStart;
//imgNum tildeles værdien for imgStart
// -- og imgNum vil have samme værdi uanset hvor mange gange funktionen startes ...

        imgEnd=imgStart+4; 
imgEnd sættes lig den værdi som imgStart får når der er klikket 4 gange på billedet
// -- og det vil ske for hvert eneste kald ...

          imgNum++
//der lægges en til imgNum for hver gang funktionen udføres
// hver gang funktionen startes vil imgNum tælles een højere, end den havde, før denne kommando udføres, dvs. en mere en aflæsningen af parseInt(biler[i].split("*")[6]);


          if (imgNum==imgEnd)
//hvis imgNum er lig imgEnd, altså hvis der er klikket 4 gange på billedet så
// imgNum vil altid være præcis 3 mindre end imgEnd ...

              {imgNum=imgStart}
sættes imgNum lig imgStart, dvs. man kan begynde forfra med klikke på billedet
         
  document.images["bil_"+biler[i].split("*")[5]+""].src=img[imgNum].src
}
//det billede som klikkes på skifter til det billede der er gemt i billedstien bestemt udfra imgNum
Avatar billede koch Nybegynder
18. december 2003 - 23:34 #22
Så er det vel her problemet opstår hvis imgNum sættes lig imgStart for hver gang der klikkes på billedet?

      imgNum=imgStart;
//imgNum tildeles værdien for imgStart
// -- og imgNum vil have samme værdi uanset hvor mange gange funktionen startes ...
Avatar billede roenving Novice
18. december 2003 - 23:36 #23
Det er meget tænkeligt, ja !-)
Avatar billede koch Nybegynder
18. december 2003 - 23:38 #24
Jeg når først lige at se på det i morgen! Uha det er spændende ;o)
Avatar billede koch Nybegynder
19. december 2003 - 20:42 #25
Nu er problemet fundet og nu skal jeg bare have det løst!
Jeg skal altså have deklareret
imgStart=parseInt(biler[i].split("*")[6]) og imgNum=imgStart udenfor imgShift();

Jeg havde tænkt:

function printCar1(){
txt="";
for (i=0; i<8; i++){
txt+="<td onMouseover=\"imgStart="+parseInt(biler[i].split("*")[6])+",imgNum="+imgStart+" \"><a href=\"java script:imgShift(i);\"><img src=\"Pics/"+biler[i].split("*")[0]+"/IMAGE001.jpg\" name=\"bil_"+biler[i].split("*")[5]+"\"></a>}
document.write("<tr>"+txt+"</tr>")
}
 
altså at deklarere imgStart vha. en onmouseOver. Tager onMouseover så ikke værdien for 'i' for den pågældende bil som musen er over, som jeg gerne vil have den til?

Og finder imgShift() så ikke selv ud af at tage imgStart når der klikkes på billedet?
Avatar billede koch Nybegynder
20. december 2003 - 01:02 #26
Jeg har oprettet to arrays:

var imgStart=new Array();
for (i=0;i<biler.length; i++)
    {imgStart[i]=parseInt(biler[i].split("*")[6]);}

var imgNum=new Array();
for (i=0;i<biler.length; i++)
    {imgNum[i]=imgStart[i];}


og tilføjet
imgStart[i], imgNum[i] i

function printCar1(){
txt="";
for (i=0; i<8; i++){
txt+="<td onMouseover=\"imgStart[], imgNum[i]\"><a href=\"java script:imgShift("+i+");\"><img src=\"Pics/"+biler[i].split("*")[0]+"/IMAGE001.jpg\" name=\"bil_"+biler[i].split("*")[5]+"\"></a>}
document.write("<tr>"+txt+"</tr>")
}

-det virker. Skulle I sidde med et forslag vil jeg stadig meget gerne høre om der er andre smarte måder at gøre det på. Smid venligst et svar hver, så deler jeg pointene mellem jer.

-Mange tak for hjælpen ;o)
Avatar billede roenving Novice
20. december 2003 - 11:36 #27
Selv ville jeg gøre det fra start, at dele alle mine data ud i arrays, så split-funktionen ikke skal gennemføres så mange gange !-)

for(i=0;biler.length>i;i++)biler[i] = biler[i].split("*");

På den måde undgår du senere at skulle udføre split og kan adressere dine data med:

biler[i][6]

-- dermed tager du en anelse fra hukommelsesrummet, men undgår en masse processering !-)

-- men ellers velbekomme '-)

-- det er forhåbentlig afslutningen på føljetonen !o]
Avatar billede koch Nybegynder
26. december 2003 - 09:29 #28
Det er det ;o) Tak for hjælpen og glædelig jul ;o)
Avatar billede roenving Novice
26. december 2003 - 18:21 #29
-- tak for points ;~}

-- og et glædeligt nyt år !-)
Avatar billede olebole Juniormester
28. december 2003 - 20:22 #30
... og så er der i øvrigt dømt Guld for insisterende udholdenhed til roenving  ;o)
/mvh
Avatar billede roenving Novice
28. december 2003 - 23:50 #31
*lol*
Avatar billede koch Nybegynder
29. december 2003 - 15:37 #32
Helt sikkert ;o)
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