Toon posts:

[DHTML/XML] functie aanroep in setTimeout levert fout op

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met een grappig scriptje waarmee ik met javascript een xml-bestand uitlees en die waardes vervolgens in span-tags gooi, die ik id's gegeven heb.

code:
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
<script language="JavaScript" type="text/JavaScript" for="window" event="onload">
<!--

var xmlDoc=new ActiveXObject("Microsoft.XMLDOM")
var d = document;

function loadXML()
{
    xmlDoc.async="false"
    xmlDoc.load("data.xml")
}

function showData()
{
    bla.innerHTML = xdc.item(0).text
    blabla.innerHTML = xdc.item(1).text
    blie.innerHTML = xdc.item(2).text
    blieblie.innerHTML = xdc.item(3).text
    blo.innerHTML = xdc.item(4).text
}

function showDataLoop()
{
    this.aantal = 0;

    for (i=0; i < 5; i++) 
    {
        setTimeout("showData()", 5000);
        //showData();       
    }
}   

loadXML();

var xdc = xmlDoc.documentElement.childNodes;

showDataLoop();
// -->
</script>


In de for-loop van showDataLoop staat de showData als comment en de setTimeout actief. Dit lever errors op op regel 1, character 1, die dus niet kloppen want op 1,1 staat geen javascript.

De error die hij geeft, wel braaf na 5 seconden trouwens, is Object Expected, en dat vijf keer.

Als ik het om draai, dus de setTimeout comment en de showData actief maak doet ie het prima.

Maar ik wil juist dat er telkens 5 seconden tussen zit, omdat het xml bestand server side wordt geupdate om de paar seconde en hij dus 5 keer een andere waarde moet gaan laten zien (vandaar de 5 in het loopje).

Welke XML-javascript junk kan mij vertellen waarom dat zo is en alos het mogelijk is ook de oplossing.

BTW: ik weet dat dit script nu alleen nog IE-only is, daar werk ik nog aan.

edit: error bijgevoegd

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 29-08 19:47

Bosmonster

*zucht*

Kweet niet precies waarom je die fout krijgt, maar wat sowieso niet gaat werken is de manier waarop je nu probeert om de 5 seconden showData() uit te voeren :) De for-loop wordt achter elkaar afgewerkt, waarin de 5 losse 'threads' opgestart worden. 5 seconden later worden ze in even rap tempo alle 5 uitgevoerd.

Probeer het eens zonder de for-loop en alleen een setTimeout?

Verwijderd

Topicstarter
Dan komen nog steeds die vijf errors op 1,1.

Heb je in javascript niet toevallig een soort sleep(); om die setTimeout te vervangen?

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 29-08 19:47

Bosmonster

*zucht*

dannydude schreef op 31 juli 2002 @ 13:27:
Dan komen nog steeds die vijf errors op 1,1.

Heb je in javascript niet toevallig een soort sleep(); om die setTimeout te vervangen?
Nope.. wat je wel kunt doen is zoiets natuurlijk :)

code:
1
2
3
for (i=0; i < 5; i++)   {
     setTimeout("showData()", 5000*i);
}


Dan doet ie het wel om de 5 seconden ;)

(Over je foutmelding weet ik het helaas ff niet...)

Verwijderd

Topicstarter
Jah, das wel slim. Maar moet ik die ;) begrijpen als "t werkt wel, maar het is niet zo'n nette oplossing' of als ' alsjeblieft, graag gedaan' ?

In beide gevallen bedankt ;)

Edit:
de code moet dan trouwens eigenlijk dit zijn, met de jouwe begint ie al de eerste seconde, terwijl hij pas na 5 seconde hoeft te updaten...
code:
1
2
3
4
5
6
function showDataLoop()
{
    for (i=1; i <= 5; i++)  {
         setTimeout("showData()", 5000*i);
    }
}

Verwijderd

Verwijderd schreef op 31 juli 2002 @ 12:50:
code:
1
var xdc = xmlDoc.documentElement.childNodes;
Kan het zijn dat het data.xml hier nog niet goed is ingeladen? En dus xmlDoc.document en xmlDoc.document.childNodes nog niet bestaan?

Verwijderd

Topicstarter
Nee, dat kan niet, omdat wanneer ik, zoals ik in het eerste post al zei, de showData() buiten de setTimeout haal hij het prima doet. Dat is vind ik het vreemde er aan.

Kan het niet zo zijn dat hij doordat er een extra functie tussen zit de overerving van de globals niet gepakt worden?

Verwijderd

Topicstarter
Even ter verduideliking:
Ik ben er nu achter dat het aantal errors niet afhankelijk is van het aantal elementen van showData, maar van het aantal keer dat het loopje wordt gedraaid in showDataLoop.

Ook de reden dat ie de fout op 1,1 zet weet ik nu: de eerste parameter van setTimeout is enigzins te vergelijken met eval, omdat je je functie moet quoten. Dat betekent dus dat hij bij die parameter ook een nieuwe regel en character count begint. Er wordt dus een object niet gevonden in de simpele regel showData();

Weet iemand met deze extra informatie wel een oplossing?
Pagina: 1