Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.
Waarom geef je uberhaupt een array als parameter mee, als deze toch al globaal beschikbaar is (je 'ad4' variabele)?
Verwijderd
Met deze regel:
1
| setTimeout('chgAd('+ad+')',1000); |
Gaat de boel de mist in. ad is namelijk een Array. Die Array kan je op die manier niet doorgeven. Zoals deheer boven mij al zegt: het is onnodig om de array als parameter mee te geven.
Als ik de array naar een nieuwe, tijdelijke globale array kopieer om te voorkomen dat hij weer wordt verwijderd blijft het probleem bestaan.
Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.
Dat werkt niet met setTimeout(code, timeout). Je kunt enkel een string code meegeven die wordt geëvalueerd na timeout seconden. Zodra je 'chgAd(' + ad + ')' als code opgeeft, wordt de string waarde van het array ad gebruikt. Dat is hetzelfde setTimeout('chgAd(ad4, aa, bb, cc, dd)', 1000) aanroepen. Ofwel na timeout seconden roept je chgAd vanuit globale scope aan met argumenten ad4, aa, bb, cc en dd. Toevallig bestaat er een globale variabele met de naam gelijk aan het eerste element van het array. Maar het gaat fout bij het tweede argument, aa, dat niet bestaat. Nergens, en zeker niet in globale scope.Johnny schreef op 12 juli 2004 @ 21:36:
Omdat er ook nog een ad1, ad2 en ad3 bij komen die allemaal gebruik maken van dezelfde functies, daarom is het wel nodig om de array als parameter mee te geven.
Probeer een globaal array van arrays. Zoals het volgende.Als ik de array naar een nieuwe, tijdelijke globale array kopieer om te voorkomen dat hij weer wordt verwijderd blijft het probleem bestaan.
1
2
3
4
| var ads = []; ads["ad1"] = ["aa", "bb", cc", ...]; ads["ad2"] = ["dd", "ee", "ff", ...]; ... |
Je kunt dan de index, zoals "ad1", "ad2" enz., meegeven als string paramater aan de betreffende functies.
[ Voor 7% gewijzigd door Xlnt op 12-07-2004 23:58 ]
"It's not that I'm lazy. It's that I just don't care."
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| function foo() { a = [1,2,3,4]; setTimeout('bar('+a.toSource()+')',1000); // werkt alleen in browsers die JavaScript 1.3 ondersteunen setTimeout('bar(['+a.toString()+'])',2000); // werkt ook in IE } function bar(b) { alert(b[1]); } foo(); |
Note dat toString problemen geeft als er strings in je array zitten; het beste is om voor IE ook een toSource() method te schrijven
[ Voor 18% gewijzigd door crisp op 13-07-2004 07:43 ]
Intentionally left blank
Wel moet ik er bij zeggen dat wanneer ik ads['ad1'] gebruikte het ook niet werkte, ads[1] werkte gelukkig wel, en die "ad" plak ik er gewoon later voor, dat scheelt ook meteen weer een paar bytes.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
| <html>
<head>
<title>Javascript test</title>
<script type="text/javascript">
var ads = [];
ads[1] =['aa','bb','cc','dd'];
ads[2] =['aa','bb','cc','dd'];
ads[3] =['aa','bb','cc','dd'];
ads[4] =['aa','bb','cc','dd'];
function init(){
chgAd(1);
chgAd(2);
chgAd(3);
chgAd(4);
}
function chgAd(n){
setAd(Math.round(Math.random()*(ads[n].length-1)),n);
}
function setAd(i,n){
document.getElementById('ad'+n).innerHTML=ads[n][i];
setTimeout('chgAd('+n+')',200);
}
</script>
</head>
<body onload="init();">
<div id="ad1"></div>
<div id="ad2"></div>
<div id="ad3"></div>
<div id="ad4"></div>
</body>
</html> |
Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.
Het probleem dat je geen ad1 kan doorgeven is ook simpel op te lossen:
1
| setTimeout('chgAd(\'ad'+n+'\')',200); |
let op de escaped quotes
Als je het nog sneller wilt hebben sla dan ook de referentie naar je objecten op in een array; dat scheelt je weer lookups.
[ Voor 16% gewijzigd door crisp op 13-07-2004 13:38 ]
Intentionally left blank