Toon posts:

[AJAX] readyState is weg

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb het volgende stukje script, en nu vraag ik mij af (mischien staar ik me blind) waarom ik in de functie die ik uitvoer bij het onreadystatechange event, ik de readyState niet op kan vragen, hij geeft dan undefined terug. Tenminste, in IE.

JavaScript:
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
fsmXmlCreateHandler = function(){
    var fsmXmlHandler;
    if(window.XMLHttpRequest){
        try{
            fsmXmlHandler = new XMLHttpRequest();
        }catch(er){
            fsmXmlHandler = false;
        }
    }else if(window.ActiveXObject){
        try{
            fsmXmlHandler = new ActiveXObject("Microsoft.XMLHTTP");
        }catch(er){
            fsmXmlHandler = false;
        }
    }
    this.fsmXmlHandler = fsmXmlHandler;
    this.fsmXmlSend = function(fsmXmlHandlerAction,fsmXmlHandlerMethod,fsmXmlHandlerVars){
        this.fsmXmlHandler.open(fsmXmlHandlerMethod,fsmXmlHandlerAction,true);
        this.fsmXmlHandler.setRequestHeader("Cache-Control","no-cache"); 
        this.fsmXmlHandler.setRequestHeader("X_USERAGENT","fsm_xml_app");
        this.fsmXmlHandler.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
        this.fsmXmlHandler.send(fsmXmlHandlerVars);
        this.fsmXmlHandler.onreadystatechange = this.fsmXmlReadyState;
    }
    this.fsmXmlReadyState = function(){
        alert(this.fsmXmlHandler.readyState);
    }
    this.fsmXmlGetDocument = function(){
        this.fsmXmlResponse = fsmXmlHandler.responseXML;
        this.fsmXmlResponse.documentElement;
    }
}


Hiermee voer ik het uit:

HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<html>
<head>
    <title>Untitled</title>
    <script src="index.js" type="text/javascript"></script>
    <script type="text/javascript">
        function test(){
            fsmXmlHandler = new fsmXmlCreateHandler();
            fsmXmlHandler.fsmXmlSend("index_xml.php","post");
        }
    </script>
</head>
<body>
<a href="javascript:test();">aa</a>
</body>
</html>


Alvast bedankt.

[ Voor 20% gewijzigd door Verwijderd op 04-07-2006 15:29 ]


  • --MeAngry--
  • Registratie: September 2002
  • Laatst online: 11-02 16:38

--MeAngry--

aka Qonstrukt

Het gaat fout met het this keyword. Als je this eerst aan een variabele koppelt (bijvoorbeeld _this) en dan de functie koppelt als _this.fsmXmlReadyState; zou het moeten werken. :)

Tesla Model Y RWD (2024)


  • André
  • Registratie: Maart 2002
  • Laatst online: 11-02 14:19

André

Analytics dude

En als je het zo doet:

JavaScript:
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
fsmXmlCreateHandler = function()
{
    var fsmXmlHandler;
    if(window.XMLHttpRequest){
        try{
            fsmXmlHandler = new XMLHttpRequest();
        }catch(er){
            fsmXmlHandler = false;
        }
    }else if(window.ActiveXObject){
        try{
            fsmXmlHandler = new ActiveXObject("Microsoft.XMLHTTP");
        }catch(er){
            fsmXmlHandler = false;
        }
    }
    this.fsmXmlHandler = fsmXmlHandler;
    this.fsmXmlSend = function(fsmXmlHandlerAction,fsmXmlHandlerMethod,fsmXmlHandlerVars){
        this.fsmXmlHandler.open(fsmXmlHandlerMethod,fsmXmlHandlerAction,true);
        this.fsmXmlHandler.setRequestHeader("Cache-Control","no-cache"); 
        this.fsmXmlHandler.setRequestHeader("X_USERAGENT","fsm_xml_app");
        this.fsmXmlHandler.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
        this.fsmXmlHandler.send(fsmXmlHandlerVars);
        var self = this;
        this.fsmXmlCreateHandle.onreadystatechange = function() { self.fsmXmlReadyState(); }
    }
    this.fsmXmlGetDocument = function(){
        this.fsmXmlResponse = fsmXmlHandler.responseXML;
        this.fsmXmlResponse.documentElement;
    }
}

fsmXmlCreateHandle.prototype.fsmXmlReadyState = function()
{
  alert(this.fsmXmlHandler.readyState);
}

Verwijderd

Topicstarter
Tanx, dat was m, |:( tijd om naar huis te gaan denk ik :)

Verwijderd

Topicstarter
Eh, klein vraagje nog, (mag dat in hetzelfde topic? :D ) ik heb m nu zo:

JavaScript:
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
fsmXmlCreateHandler = function(){
    var fsmXmlHandler; 
    if(window.XMLHttpRequest){ 
        try{ 
            fsmXmlHandler = new XMLHttpRequest(); 
        }catch(er){ 
            fsmXmlHandler = false; 
        } 
    }else if(window.ActiveXObject){ 
        try{ 
            fsmXmlHandler = new ActiveXObject("Microsoft.XMLHTTP"); 
        }catch(er){ 
            fsmXmlHandler = false; 
        } 
    } 
    this.fsmXmlHandler = fsmXmlHandler; 
    this.fsmXmlSend = function(fsmXmlHandlerAction,fsmXmlHandlerMethod,fsmXmlHandlerVars){ 
        this.fsmXmlHandler.open(fsmXmlHandlerMethod,fsmXmlHandlerAction,true); 
        this.fsmXmlHandler.setRequestHeader("Cache-Control","no-cache");  
        this.fsmXmlHandler.setRequestHeader("X_USERAGENT","fsm_xml_app"); 
        this.fsmXmlHandler.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); 
        this.fsmXmlHandler.send(fsmXmlHandlerVars); 
        var self = this; 
        this.fsmXmlHandler.onreadystatechange = function(){self.fsmXmlReadyState();}
        this.fsmXmlGetDocument();
    } 
    this.fsmXmlGetDocument = function(){ 
        if(this.fsmXmlReady){
            this.fsmXmlResponse = this.fsmXmlHandler.responseXML; 
            this.fsmXmlDocument = this.fsmXmlResponse.documentElement;
        }else{
            this.fsmXmlGetDocument();
        }
    } 
    this.fsmXmlReadyState = function(){
        if(this.fsmXmlHandler.readyState == 4){
            this.fsmXmlReady = true;
        }else{
            this.fsmXmlReady = false;
        }
    }
}


Het gaat om regel 32, zoals ie nu staat gaat het uiteraard niet, maar ik vraag me af hoe ik dit kan doen, de bedoeling is dat de functie pas wordt afgerond als het document geladen is. Dus de functie fsmXmlSend mag pas stoppen als fsmXmlReady op 'true' staat. Kan dat?

  • André
  • Registratie: Maart 2002
  • Laatst online: 11-02 14:19

André

Analytics dude

Misschien met een timeout:
code:
1
setTimeout("this.fsmXmlGetDocument();", 500);
En anders roep je hem na regel 37 aan?

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 09-12-2025
Ik zou er dan zoiets van maken:
JavaScript:
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
fsmXmlCreateHandler = function(){
    var fsmXmlHandler; 
    if(window.XMLHttpRequest){ 
        try{ 
            fsmXmlHandler = new XMLHttpRequest(); 
        }catch(er){ 
            fsmXmlHandler = false; 
        } 
    }else if(window.ActiveXObject){ 
        try{ 
            fsmXmlHandler = new ActiveXObject("Microsoft.XMLHTTP"); 
        }catch(er){ 
            fsmXmlHandler = false; 
        } 
    } 
    this.fsmXmlHandler = fsmXmlHandler; 
    this.fsmXmlSend = function(fsmXmlHandlerAction,fsmXmlHandlerMethod,fsmXmlHandlerVars)
    { 
        this.fsmXmlHandler.open(fsmXmlHandlerMethod,fsmXmlHandlerAction,true); 
        this.fsmXmlHandler.setRequestHeader("Cache-Control","no-cache");  
        this.fsmXmlHandler.setRequestHeader("X_USERAGENT","fsm_xml_app"); 
        this.fsmXmlHandler.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); 
        this.fsmXmlHandler.send(fsmXmlHandlerVars);
        var self = this;
        this.fsmXmlHandler.onreadystatechange = function()
        {
            if ( self.fsmXmlIsReady() )
            {
                self.fsmXmlResponse = self.fsmXmlHandler.responseXML; 
                self.fsmXmlDocument = self.fsmXmlResponse.documentElement;
            }
        }
    } 
    this.fsmXmlIsReady = function()
    {
        return this.fsmXmlHandler.readyState == 4;
    }
}

Noushka's Magnificent Dream | Unity


  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

Verwijderd schreef op dinsdag 04 juli 2006 @ 16:04:
[...]
Het gaat om regel 32, zoals ie nu staat gaat het uiteraard niet, maar ik vraag me af hoe ik dit kan doen, de bedoeling is dat de functie pas wordt afgerond als het document geladen is. Dus de functie fsmXmlSend mag pas stoppen als fsmXmlReady op 'true' staat. Kan dat?
Waarom zou je dat willen? Het idee achter AJAX is juist dat het asynchroon is. Door een handler te definieren die de inkomende gegevens verwerkt, is het asynchroon. Wat je nu wil, is dat je wacht tot er reactie is?

Ik ben benieuwd naar de werking als de lijn laggy is o.i.d.

Terugdenkend naar een oplossing, ik zou jouw AJAX functie zo generiek mogelijk houden en er niet van die wacht-zaken in stoppen. Dat kun je beter en gemakkelijker aan de applicatie overlaten. Die weet immers precies wanneer wat moet gebeuren. Zo kun je je functie ook voor iets anders gebruiken.

Fat Pizza's pizza, they are big and they are cheezy


Verwijderd

Topicstarter
Je hebt gelijk, ik heb het script dat uitgevoerd moet worden bij onreadystatechang nu buiten de functie gehouden. Eigenlijk was mn bedoeling om de functie zo te schrijven dat ik bij het aanmaken van het object, meteen de xml DOM aan het object kon koppelen. Maar aangezien je dan moet wachten tot het document klaar is met laden..
Pagina: 1