Avatar billede keet Nybegynder
10. juni 2004 - 12:34 Der er 33 kommentarer og
1 løsning

mystisk fejl dekleration af varibel

Jeg har følgende kode:
<script>
var n=0;
function rotate(linkid,strfilename)
{
var path='images/';
var arrlinks = strfilename.split(';');
var imgs = new Array();
var c=0;
   
for ( i=0; i<=arrlinks.length-1; i++) {
imgs[c] = new Image();imgs[c++].src=path+arrlinks[i];
}

document.getElementById(linkid).src=imgs[n].src;
(n==(imgs.length-1))?n=0:n++;
}
</script>


Hvis jeg sætter "var n=0;" ind i funktionen virker det ikke.

Nogen der kan finde en løsning?
Avatar billede keet Nybegynder
10. juni 2004 - 12:40 #1
Tror jeg har fundet fejlen.... måske...
Avatar billede keet Nybegynder
10. juni 2004 - 12:43 #2
Jeg tror problemet er at jeg bruger setInterval() og hvis jeg sætter "var n = 0" ind i funktionen bliver n sat til 0 hvergang.

rotate() skal lave en form for banner.
Avatar billede knudx Nybegynder
10. juni 2004 - 12:43 #3
linien

(n==(imgs.length-1))?n=0:n++;

er noget vrøvl. Den måde at skrive en if-sætning på kan ikke stå alene, men bruges til at vælge mellem to værdier som skal sendes til en funktion eller tildeles en variabel.

skriv sådan:
n++;
if (n>=imgs.length) n=0;
Avatar billede knudx Nybegynder
10. juni 2004 - 12:47 #4
du bruger var UDENFOR function-defifnitions-blokken, for at gøre n til en top-level variabel. Så kan du INDENI funktionen skrive n eller window.n, og så er det den samme n i hvert timeout. Hvis du bruger var INDE I funktionen, laver du en ny variabel for hvert interval, som altid er nul :^(
Avatar billede keet Nybegynder
10. juni 2004 - 12:54 #5
n bliver brugt til at angive hvilket billede der skal vises. hvordan kan jeg lave koden så det hele står i en funktion?
Avatar billede keet Nybegynder
10. juni 2004 - 12:55 #6
For at køre det har jeg:
<img id='11' src='images/top13a.png' alt='' border='0'>
<script>setInterval("rotate(11,'top13a.png;top13b.png;top13c.png');",500);</script>

Men setInterval() skal vel ind i funktionen på en måde?
Avatar billede knudx Nybegynder
10. juni 2004 - 13:05 #7
næ, setInterval er en gentage-det-samme-i-en-uendelighed funktion.
Du burde faktisk lave to funktioner, én til at lave en array af Image-objekter, og én til at styre rotationen. Image-objektet kan nemlig 'preloade' billedet, så browseren er klar til at skifte ud hurtigt.
For at virke på den måde skal Image objekterne genereres når siden loades (fks i et script i head) og ikke, som i din funktion ovenfor, på det tidspunkt hvor billederne skal bruges.


nb: Hvis der er flere 'bannere' på samme side får du problemer med variabelnavne...
Avatar billede keet Nybegynder
10. juni 2004 - 13:10 #8
jeg har netop flere flere bannere på samme side... men jeg kan ikke lige gennemskue hvordan jeg løser dette..
Avatar billede knudx Nybegynder
10. juni 2004 - 13:10 #9
fks
<img id='11' src='images/top13a.png' alt='' border='0'>
<script>
    var imgs = fixPreloadArray ('top13a.png;top13b.png;top13c.png');
    setInterval("rotate('11',imgs);",500);
</script>
Avatar billede knudx Nybegynder
10. juni 2004 - 13:12 #10
nå, nu kom mit svar efter din kommentar, jeg havde ikke læst den da jeg skrev det
Avatar billede keet Nybegynder
10. juni 2004 - 13:15 #11
det med variabel-navne var egentlig grundet til at holde det i en funktion, der så bare kunne køres på hver banner.
Avatar billede knudx Nybegynder
10. juni 2004 - 13:21 #12
Du må finde en måde de forskellige variable kan blive holdt ude fra hinanden.
Det nemmest er for hver banner at lave et objekt som indeholder en tæller og en array med billeder
Avatar billede knudx Nybegynder
10. juni 2004 - 13:22 #13
problemet er at funktionen bliver kaldt på ny for hver interval, og så oprettes nye 'interne' variabler
Avatar billede keet Nybegynder
10. juni 2004 - 13:26 #14
du mener ikke det kan løses på nogen måde ved kun at have én funktion eller 2?
Avatar billede roenving Novice
10. juni 2004 - 13:28 #15
<script type="text/javascript">
var n = new Array();
function rotate(linkid,strfilename){
if(!n[linkid])n[linkid] = 0;
var path='images/';
var arrlinks = strfilename.split(';');
document.getElementById(linkid).src=path+arrlinks[n[linkid]];
n[linkid] = (++n[linkid])%arrlinks.length;
}
</script>

-- der indgår en preloader, som ikke giver nogen mening, når alle billeder loades hver gang, derfor har jeg udeladt den ...
Avatar billede keet Nybegynder
10. juni 2004 - 13:32 #16
kan jeg ikke lave et array hvor hver element består af et id og en tæller?
så kan jeg vel lave et opslag for at se hvorlangt en banner er nået.
Avatar billede keet Nybegynder
10. juni 2004 - 13:32 #17
aa så ikke dit svar :)
Avatar billede knudx Nybegynder
10. juni 2004 - 13:34 #18
<script>
function fix_preload(strfilename)
{
var path='images/';
var arrlinks = strfilename.split(';');
var imgs = new Array(), c;
   
for ( i=0; i<arrlinks.length; i++) {
c = new Image();
c.src = path+arrlinks[i];
imgs.push(c);
}
return imgs;
}

function rotate (obj) {
    obj.n ++;
    if (obj.n >= obj.imgs.length) obj.n = 0;
    document.getElementById(obj.imgID).src = obj.imgs[obj.n].src;
}
</script>
----------------------
<img id='11' src='images/top13a.png' alt='' border='0'>
<script>
    var obj_11 = {
        'imgs' : fix_preload ('top13a.png;top13b.png;top13c.png'),
        'imgID' : '11',
    'n' : 0
    }
    setInterval("rotate(obj_11);",500);
</script>
Avatar billede knudx Nybegynder
10. juni 2004 - 13:52 #19
hehe, der er mange måder at flå en kat, som det hedder på engelsk...
q:^)
Avatar billede keet Nybegynder
10. juni 2004 - 13:55 #20
roenving <- jeg kan ikke lige få det script til at virke
Avatar billede roenving Novice
10. juni 2004 - 13:57 #21
-- du har også en ugyldig reference, da et id _ikke_ må starte med et tal, det havde jeg ikke kigget på, men så:

<img id='i11' src='images/top13a.png' alt='' border='0'>
<script>setInterval("rotate('i11','top13a.png;top13b.png;top13c.png');",500);</script>
Avatar billede keet Nybegynder
10. juni 2004 - 14:03 #22
Jeg fik det til at virke også uden det med id'et.

Jeg kan se at min mozilla står og "Transfering data from .." hver gang billedet skirfter. Hvorfor går den det ligepludselig?
Det gjorde den ikke før.
Avatar billede roenving Novice
10. juni 2004 - 14:03 #23
-- men principielt er det det også bedre at bruge knudx' ide, som også preloader billederne, men han har heller ikke være opmærksom på den html-fejl, det er at bruge et id med et tal forrest eller den javascript-fejl, det tilsvarende vil være at bruge identifier, som starter med et tal. Desuden kan en lille forbedring laves:

<script type="text/javascript">
function fix_preload(strfilename){
var path='images/';
var arrlinks = strfilename.split(';');
var imgs = new Array(), c;
   
for ( i=0; i<arrlinks.length; i++) {
c = new Image();
c.src = path+arrlinks[i];
imgs.push(c);
}
return imgs;
}

function rotate (obj) {
    obj.n = (++obj.n)%obj.imgs.length;
    document.getElementById(obj.imgID).src = obj.imgs[obj.n].src;
}
</script>
----------------------
<img id='i11' src='images/top13a.png' alt='' border='0'>
<script type="text/javascript">
    var obj_11 = {
        'imgs' : fix_preload ('top13a.png;top13b.png;top13c.png'),
        'imgID' : 'i11',
    'n' : 0
    }
    setInterval("rotate(obj_11);",500);
</script>

-- desuden er principielt nødvendigt at angive en type for et script-tag ...
Avatar billede roenving Novice
10. juni 2004 - 14:05 #24
-- og den sidste script-blok kan du forkorte til een eller to linjer:

<script type="text/javascript">
    var obj_11 = {'imgs' : fix_preload ('top13a.png;top13b.png;top13c.png'),'imgID' : 'i11','n' : 0};
    setInterval("rotate(obj_11);",500);
</script>
Avatar billede keet Nybegynder
10. juni 2004 - 14:09 #25
når jeg sætter flere bannere går der alligevel noget galt.
Det er som om mozilla ikke kan håndtere flere setInterval().

IE virker fint.
Avatar billede keet Nybegynder
10. juni 2004 - 14:17 #26
Jeg har prøvet dit script knudx og nu kommer mozilla ikke med "Trasfering data from.." længere, men mozilla har stadig problemer med setInterval()..

Kan i se hvorfor?
Avatar billede roenving Novice
10. juni 2004 - 14:20 #27
Jeg har ikke haft problemer med flere setIntervals, men vi kan da snyde lidt:

<script type="text/javascript">
    var obj_11 = {'imgs' : fix_preload ('top13a.png;top13b.png;top13c.png'),'imgID' : 'i11','n' : 0,'ival':0};
    obj_11.ival = setInterval("rotate(obj_11);",500);
</script>
Avatar billede keet Nybegynder
10. juni 2004 - 14:32 #28
ok.. vil I dele pointne?
Avatar billede roenving Novice
10. juni 2004 - 14:36 #29
Ej, der er vist ikke noget at del ,-)
Avatar billede keet Nybegynder
10. juni 2004 - 14:50 #30
hmm.. min mozilla står stadig og siger "Transfering data..." meget hurtigt. Kan jeg løse dette på nogen måde?
Avatar billede keet Nybegynder
10. juni 2004 - 14:59 #31
Ved I hvorfor den gør det?
Avatar billede roenving Novice
10. juni 2004 - 15:02 #32
Med den konstruktion vil den preloade alle bannere fra start, så den burde blive færdig ret hurtigt, og så ikke igen have brug for det ...
Avatar billede keet Nybegynder
10. juni 2004 - 15:12 #33
Den gør det alligevel heletiden...
Avatar billede keet Nybegynder
10. juni 2004 - 15:32 #34
Hmm jeg har lavet 3 bannere med henholdsvis et A,B,C på... de kommer ikke i rækkefølge... Hvad kan dette skyldes?
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