[JS] variabele wordt niet goed opgepakt

Pagina: 1
Acties:

  • mcB
  • Registratie: Mei 2002
  • Laatst online: 22-04 11:47
Ik heb al van alles geprobeerd, maar ik weet geen raad met het volgende probleem.
Ik heb zelf een uitgebreider stuk code, maar de kern van het probleem kan goed geillustreerd worden door de volgende code.
HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<html>
<head>
<title>test</title>
<script language="JavaScript">

var myname = "";
var state1 =    "<p>Hallo "+ myname +"</p>";

function initAndStart(theName){
    myname = theName;
    document.getElementById('greeting').innerHTML = state1;
}

</script>
</head>
<body onload="initAndStart('Piet')">
<div id="greeting">
</div>
</body>
</html>

Wat ik verwacht;
Zodra de html pagina geopend wordt, wordt de myname var geset. Ik verwacht dan dus dat de var state1 de volgende waarde bevat: 'Hallo Piet'
Het stuk html met Hallo Piet zou dan getoond moeten worden.

Wat er gebeurt;
Omdat de var myname een lege string is, wordt state1 geinitialiseerd als 'Hallo'
Het setten van de myname via de onload in de html is dan dus al te laat.

Wat doe ik verkeerd, of hoe zou het anders kunnen/moeten?

Strix (Skullflame)


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Ik zou het setten van state1 via een functie doen:
JavaScript:
1
2
3
4
5
var state1 = "";
function setState1(value)
{
  state1 = "<p>Hallo "+ value+"</p>";
}

en dan in functie initAndStart:
JavaScript:
1
setState1(theName);

Simpel toch?

Noushka's Magnificent Dream | Unity


  • mcB
  • Registratie: Mei 2002
  • Laatst online: 22-04 11:47
Het werkt! Bedankt Michali d:)b

Toch vind ik het vreemd dat de situatie als ik in eerste instantie had niet werkt. Is daar een reden voor??
Voor zover ik kan zien lijkt me het eerder een bug, dan een feature.

Strix (Skullflame)


  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Hoezo bug :?

Je set state1 maar 1 keer en op dat moment is myname gewoon leeg ;)

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Verwijderd

volgens mij gewoon de volgorde:

var myname = "";

function initAndStart(theName){
myname = theName;
var state1 = "<p>Hallo "+ myname +"</p>";
document.getElementById('greeting').innerHTML = state1;

Zou volgens mij wel moeten werken.

[ Voor 24% gewijzigd door Verwijderd op 16-08-2005 13:56 ]


  • mcB
  • Registratie: Mei 2002
  • Laatst online: 22-04 11:47
Op het moment dat ik state1 wil gebruiken, moet er toch gezien worden dat z'n waarde een referentie naar een andere var(myname) bevat. De waarde van state1 moet dan opnieuw worden bepaald.
Dat werkt in andere (script)talen namelijk wel zo.

Strix (Skullflame)


  • MaTriCX
  • Registratie: Augustus 2002
  • Laatst online: 18-07-2024
Ja die laatste optie zou inderdaad kunnen, ware het niet dat de oplossing van Michali iets netter is ivm de redundante (statische) variabele.

Maar even ontopic. Het is logisch dat de variabele state1 alleen 'Hallo' bevat, omdat deze alleen bij het laden van de pagina (aan het begin) de waarde "'Hallo' + myname" krijgt toegewezen.

Wat jij verwacht is dat wanneer myname van waarde is veranderd, state1 dit ook automatisch doet, maar dit is niet het geval. Daarvoor zul je die statement nogmaals moeten aanroepen. De code wordt uitgevoerd zoals jij het schrijft (van boven naar beneden).

code:
1
2
3
4
var myname = "";
var state1 =     "<p>Hallo "+ myname +"</p>";
var myname = "boe"; 
/* Heeft geen invloed totdat bovenstaande statement weer wordt uitgevoerd */


[edit]
Zo werkt het niet bij webpagina's, dit werkt alleen bij runtime-applicaties. Kijk maar eens naar het volgende voorbeeld.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<script>
var x = 5;
var y = x + 8;
// y is nu 13;

function telOp() {
    x += 5;
// y = 18 ? 
// of y = 13 ?
}

function drukAf() {
    alert( 'y is nu : '+y );
}

telOp();
drukAf();
</script>

y = 13 dus.

Persoonlijk zou ik het zo doen, als je de variabele state1 toch niet gaat veranderen:
code:
1
2
3
function initAndStart( divId, name ) {
     document.getElementById( divId ).innerHTML = '<p>Hallo ' +name+ '</p>';;
}

[ Voor 39% gewijzigd door MaTriCX op 16-08-2005 14:22 ]


  • mcB
  • Registratie: Mei 2002
  • Laatst online: 22-04 11:47
Bedankt voor de verhelderende uitleg MaTriCX
Ik doe normaal gesproken bijna nooit iets met javascript. Nu eigenlijk voor het eerst iets mee gedaan.
Vandaar dat ik het best wel raar vond dat mijn code niet werkte.

Strix (Skullflame)


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
mcB schreef op dinsdag 16 augustus 2005 @ 13:57:
Op het moment dat ik state1 wil gebruiken, moet er toch gezien worden dat z'n waarde een referentie naar een andere var(myname) bevat. De waarde van state1 moet dan opnieuw worden bepaald.
Dat werkt in andere (script)talen namelijk wel zo.
Dat werkt in andere script talen precies hetzelfde. Je bouwt namelijk gewoon een nieuwe string op en daarin gebruik je de waarde die in myname zit. Daarna heeft het helemaal niets meer met myname te maken. Je kunt wel referenties hebben naar variabelen, maar in geval van het puur gebruiken van de waarde is dat niet zo. Dit zou anders ook erg vreemd zijn:
JavaScript:
1
2
3
4
5
var num = 3;
var calc = 10 * num;
alert(calc); // 30
num = 4;
alert(calc); // 30 en niet 40 dus

In jouw geval werkt dat precies hetzelfde.

edit:
lol wat ben ik traag vandaag :+

[ Voor 4% gewijzigd door Michali op 16-08-2005 14:24 ]

Noushka's Magnificent Dream | Unity


  • MaTriCX
  • Registratie: Augustus 2002
  • Laatst online: 18-07-2024
Graag gedaan! Het is kwestie van gewenning, aan de hand van voorbeelden is het altijd net iets sneller te begrijpen.

[edit]
Je was mij anders voor in een ander draadje ;)

[ Voor 24% gewijzigd door MaTriCX op 16-08-2005 14:36 ]

Pagina: 1