[js]Probleem met globale variabele

Pagina: 1
Acties:

  • bibawa
  • Registratie: Augustus 2005
  • Laatst online: 13-04-2008
Ik gebruik volgende javascript code om ajax te integreren in m'n website:

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
    function createHTTPHandler(){
            httphandler = false;
            
            if (!httphandler && typeof XMLHttpRequest!='undefined') {
            httphandler = new XMLHttpRequest();
            }
            return httphandler;
    }
    
    function voerPaginaUit(pagina,oproepnaam){
        var terug="test";
        var XMLHTTPObject = createHTTPHandler();
        
        XMLHTTPObject.open('GET', pagina, true);
        XMLHTTPObject.setRequestHeader("Cache-Control", "no-cache");
        XMLHTTPObject.setRequestHeader("X_USERAGENT", oproepnaam);
        
        XMLHTTPObject.send(null);
        
        XMLHTTPObject.onreadystatechange=function() {
            if (XMLHTTPObject.readyState==4) {
                
                terug = XMLHTTPObject.responseText;
                
                
                
            }
           
        }
        
       return terug;
         
    }


de variabele terug krijgt van XMLHTTPObject.responseText; de juiste waarde (getest met alert) wanneer ik nu echter net voor de return terug nogmaals een alert doe van terug dan krijg ik tot mijn stomste verbazing de tekst "Test" te zien die bovenaan in de functie in de variabele terug is geplaatst.

Hoe kan ik dit nu voorkomen?

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:27

crisp

Devver

Pixelated

Je doet een asynchroon request, op het moment dat je functie returned is je onreadystatechange handler logischerwijs nog niet uitgevoerd.
Je zal dus of moeten werken met een synchroon request, of je onreadystatechange handler een call laten doen naar een andere functie die iets met de respons doet.

en clientside scripting hoort natuurlijk in Webdesign, Markup & Clientside Scripting ;)

[ Voor 9% gewijzigd door crisp op 16-06-2007 12:43 ]

Intentionally left blank


  • bibawa
  • Registratie: Augustus 2005
  • Laatst online: 13-04-2008
Als ik werk met een synchroon request dan zal dit ervoor zorgen dat de pagina gaat "bevriezen" en dat is de bedoeling niet..

Hoe doe je dit: Je zal dus of moeten werken met een synchroon request, of je onreadystatechange handler een call laten doen naar een andere functie die iets met de respons doet. ?

Eerlijk gezegd begrijp ik deze regels niet goed en kan er niet goed op verder bouwen:

code:
1
2
3
4
5
6
7
8
9
10
  XMLHTTPObject.onreadystatechange=function() {
            if (XMLHTTPObject.readyState==4) {
                
                terug = XMLHTTPObject.responseText;
                
                
                
            }
           
        }

  • B-Man
  • Registratie: Februari 2000
  • Niet online
bibawa schreef op zaterdag 16 juni 2007 @ 12:47:
Als ik werk met een synchroon request dan zal dit ervoor zorgen dat de pagina gaat "bevriezen" en dat is de bedoeling niet..

Hoe doe je dit: Je zal dus of moeten werken met een synchroon request, of je onreadystatechange handler een call laten doen naar een andere functie die iets met de respons doet. ?

Eerlijk gezegd begrijp ik deze regels niet goed en kan er niet goed op verder bouwen:

code:
1
2
3
4
5
6
7
8
9
10
  XMLHTTPObject.onreadystatechange=function() {
            if (XMLHTTPObject.readyState==4) {
                
                terug = XMLHTTPObject.responseText;
                
                
                
            }
           
        }
Hij bedoelt dat XMLHTTPObject.onreadystatechange pas uitgevoerd wordt (als je hem async uitvoert) zodra er een response ontvangen is.

Wil je aynchroon werken, dan moet je voerPaginaUit een functie reference meegeven, zoiets:

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function voerPaginaUit(pagina,oproepnaam, callback){
        var XMLHTTPObject = createHTTPHandler();
        
        XMLHTTPObject.open('GET', pagina, true);
        XMLHTTPObject.setRequestHeader("Cache-Control", "no-cache");
        XMLHTTPObject.setRequestHeader("X_USERAGENT", oproepnaam);
        
        XMLHTTPObject.send(null);
        
        XMLHTTPObject.onreadystatechange=function() {
            if (XMLHTTPObject.readyState==4) {
                callback( XMLHTTPObject.responseText );
            }
           
        }         
    }

function callbackFunction( responseText ) {
    alert( responseText );
}

voerPaginaUit( 'testpagina.php', 'test', callbackFunction );

voerPaginaUit() zelf geeft dan geen response.

[ Voor 5% gewijzigd door B-Man op 16-06-2007 13:07 ]


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:27

crisp

Devver

Pixelated

bibawa schreef op zaterdag 16 juni 2007 @ 12:47:
Als ik werk met een synchroon request dan zal dit ervoor zorgen dat de pagina gaat "bevriezen" en dat is de bedoeling niet..
Alleen als of je internet connectie megatraag is, of het serverside proces er lang over doet...

Intentionally left blank