[Ajax/JavaScript]Verzenden loopt achter

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • telefoontoestel
  • Registratie: Oktober 2002
  • Laatst online: 29-06-2024

telefoontoestel

Maak me gelukkig....Bel!!

Topicstarter
Ik heb het volgende probleem met gebruik van Ajax.
Als ik gegevens wil verzenden voor validatie lijkt de informatie steeds 1 poging achter te liggen.
Bij het laden van de pagina wordt meteen al een Ajax post gedaan. De verzonden data en het resultaat geef ik weer in een 2 divjes (input en output). Dit is dan
input:
action=0

output:
undefined
Vervolgens stuur ik informatie, in dit geval een username, na het invullen van het invulveld om te controleren. Het resultaat hiervan is dan:
input:
action=1, username=telefoontoestel

output
{"username":false,"password":false,"loggedin":false,"data":"preparing; action=0;"}
Die laatste output had ik dus verwacht bij het laden van de pagina!

Mijn vraag is dus: hoe kan het dat de informatie pas bij de tweede actie wordt verzonden en niet zoals verwacht direct?

De php pagina werkt naar behoren, aangezien ik na daadwerkelijke verzending wel de correcte gegevens terug krijg. Daarbij zal deze als het geen correcte informatie binnen krijgt een foutmelding terug sturen. Het probleem zal dus moeten zitten in de JavaScript functie. Mijn vraag is dus, wat gaat er mis?

De script die ik er voor gebruik:

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
40
41
42
43
44
45
46
47
48
<!--
var XMLObject, responseData;

function createHTTPHandler(){
    XMLObject = null;
    
    if(window.XMLHttpRequest) XMLObject = new XMLHttpRequest();
    else if (window.ActiveXObject) XMLObject = new ActiveXObject();
    else document.location.href('index.php?version=old');
        
    if(XMLObject == null) document.location.href('index.php?version=old');
        
    return true;
}

function checkState(){
    if (XMLObject.readyState == 4){
        if (XMLObject.status == 200){
            responseData = XMLObject.responseText;
        }
        else {
            responseData = "Problem retrieving data:" + XMLObject.statusText;
        }
    }
}

function AjaxGetData(URL){
    createHTTPHandler();
    
    XMLObject.onreadystatechange = checkState;
    XMLObject.open("GET", URL, true);
    
    XMLObject.send(null);
    
    return true;
}

function AjaxPostData(URL, data){
    createHTTPHandler();
    
    XMLObject.open("POST", URL, true);
    XMLObject.onreadystatechange = checkState;
    XMLObject.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    
    XMLObject.send(data);
    return true;
}
//-->


[edit]
Om te debuggen probeerde ik een alert te doen vlak voor de return in de AjaxPostData. Deze alert zou dan de gegevens moet weergeven die terug gekomen zijn. In plaats daarvan krijg ik een foutmelding met de omschrijving:
De gegevens die nodig zijn voor deze bewerking zijn nog niet beschikbaar
Hieruit maak ik op dat de fout dus in de checkState functie zit. Dat deze dus niet afwacht totdat de status niveau 4 heeft bereikt. Een alert geeft dan ook aan dat we nog maar bij niveau 1 zijn. Hoe moet dit dan gedaan worden?

Ik heb geëxperimenteerd met een while-loop die zou moeten wachten totdat de readyState niveau 4 heeft bereikt, maar dat resulteerd in een vastlopend script. Dat is dus ook geen optie.

[ Voor 13% gewijzigd door telefoontoestel op 08-05-2009 13:42 ]

telefoontoestel


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 19:17

crisp

Devver

Pixelated

lees je eens in in het verschil tussen asynchroon en synchroon (3e parameter van de open method)

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Offtopic, maar waarom moet je nou uberhaupt een ajax call doen direct na het laden van de pagina? Klinkt als een request welke bespaart kan worden.

{signature}


Acties:
  • 0 Henk 'm!

  • telefoontoestel
  • Registratie: Oktober 2002
  • Laatst online: 29-06-2024

telefoontoestel

Maak me gelukkig....Bel!!

Topicstarter
@crisp: Dat is dus het probleem idd. Ik had de functie beschrijving overgenomen en daar niet bij stil gestaan. Er wordt nu keurig gewacht op de data. Thanks.

@Voutloos: Die eerste request wil ik in het begin gebruiken voor debuggen. Zodra alles naar behoren werkt zal deze er ook uit worden gehaald ;)

Ik heb me nu direct beter ingelezen en zit dan nu met het volgende probleem.
Als ik de synchronous methode gebruik zal het script dus niet verder gaan.
Soms is dat handiger, maar voor een verificatie liever niet. Hoe krijg ik dan voor elkaar dat hij blijft pollen op een return, zodat ik alsnog een bewerking kan uitvoeren zodra de informatie wel beschikbaar is?

[ Voor 37% gewijzigd door telefoontoestel op 08-05-2009 18:00 ]

telefoontoestel