Avatar billede razmuz_dk Nybegynder
03. april 2006 - 02:58 Der er 10 kommentarer og
1 løsning

JSON/XmlHttpRequest: Objekter i objekter

Jeg har skrevet følgende script:

<script type="text/javascript">
var reqobj = {
    xht: null,
    init: function() {
        // alert('test');
        try {
            if(window.XMLHttpRequest) {
                this.xht = new XMLHttpRequest()
            } else if(window.ActiveXObject) {
                this.xht = new ActiveXObject("Microsoft.XMLHTTP")
            }
        }
        catch(e) {
            // alert('Request object could not be initialized!');
        }
        if(this.xht) this.xht.onreadystatechange = this.handle_response
    },
    request_file: function(filename) {
        // alert('yes'+this.xht)
        if(!this.xht) this.init()
        this.xht.open("GET", "test.txt", true)
        this.xht.send(null)
        // alert('nu');
        this.handle_response();
    },
    handle_response: function() {
        // alert(this.xht)
    }
}

reqobj.request_file('test.txt');
</script>


Problemet i ovenstående er at this.xht er undefined når det kaldes via onreadystatechange. Jeg har forsøgt at omskrive scriptet til "procedural style" (ikke objekt-orienteret) og så virker det fint.

Hvorfor er det undefined? Og hvordan undgår jeg det bliver det? Andre alternativer?

Et lille tillægsspørgsmål: skal jeg bare droppe alt det JSON/OOP hvad angår min xmlhttprequest-handler? Umiddelbart ser jeg flere fordele i at skrive det i OOP, men det er ikke sikkert det er det værd hvis det er meget tungere for klienten??..

På forhånd tak
Avatar billede mclemens Nybegynder
03. april 2006 - 13:38 #1
Og hvordan undgår jeg det bliver det?>

handle_response: function() {
  if(datafetcher.readyState==4){
  alert(this.xht)
  }
}


Hvorfor er det undefined?>
- fordi resultatet ikke er klar før onstate change har været 1,2,3 og hvis du forsøger at bruge slutresultatet inden får du fejl.

Andre alternativer? samt tillægsspørgsmålet> Ved ikke...
Avatar billede mclemens Nybegynder
03. april 2006 - 13:39 #2
arg
handle_response: function() {
  if(this.xht.readyState==4){
  alert(this.xht)
  }
}
Avatar billede razmuz_dk Nybegynder
03. april 2006 - 14:01 #3
Måske udtrykte jeg mig ikke helt klart: this.xht er ikke defined! Med andre ord er det ikke et objekt, og derfor kan jeg ikke bruge readyState-metoden.
Avatar billede razmuz_dk Nybegynder
03. april 2006 - 14:11 #4
"- fordi resultatet ikke er klar før onstate change har været 1,2,3 og hvis du forsøger at bruge slutresultatet inden får du fejl."
> De er ikke resultat den ikke kan finde/giver fejl ved. Det er simpelthen this.xht som ikke findes når det køres via onreadystatechange.
Avatar billede mclemens Nybegynder
03. april 2006 - 14:17 #5
Undskyld... virker det her bedre?

handle_response: function(){
  if(this.xht!=undefined){
  alert(this.xht)
  }
}
}
Avatar billede razmuz_dk Nybegynder
03. april 2006 - 14:48 #6
Nu er jeg ikke helt med? Jeg vil ikke tjekke om den er defined eller ej. Jeg vil have den til at VÆRE defined! :) Jeg forstår ikke HVORFOR den ikke er defined. Kan du give mig en forklaring på det- eller give en løsning på hvordan den vil blive defined??

Hvis jeg kalder this.handle_response() på traditionel vis ER den defined - men det er kun når den kaldes via onreadystatechange, at den er undefined.
Avatar billede mclemens Nybegynder
03. april 2006 - 16:49 #7
Når du bruger onreadystatechange kaldes funktionen til håndtering af requesten hver gang der sker en ændring i status på hentningen af filen... Derfor skal du gøre håndterings funktionen betinget af at status står til 4 ... når status er lig 4 er this.xht lig et object ... i det sidste tilfælde gjorde jeg det betinget at så længe this.xht endnu ikke var et object skulle håndtering ikke udføres... det med status 4 så ikke helt ud til at virke optimalt i dit script :/ ...

- jeg har sikkert misforstået dit problem så jeg undskylder igen, men this.xht når du definerer den til en xmlrequest og bruger statechange kald så kan den ikke være defined før xml hentningen er færdig... (ot her er min xml requester http://www.eksperten.dk/spm/699114#rid6179749)...
Avatar billede razmuz_dk Nybegynder
03. april 2006 - 21:40 #9
Jeg kender udmærket principperne om status = 1, 2 3 og 4.

Måske misforstår jeg dit "svar" - men jeg mener ikke jeg får svar på mit spørgsmål. Jeg prøver lige at forklare det én gang til ;)

Hvis du kigger i mit script køres handle_response() først EFTER at der i this.xht er oprettet et objekt. Men alligevel indeholder this.xht "undefined" når man alert'er den i handle_response-funktionen. Hvis jeg alert'er den fra en anden funktion efterfølgende så ER this.xht defineret som et objekt. Hvis jeg kalder handle_response på traditionel vis skriver den også at objektet findes. Det er kun når handle_reponse kaldes via onstatechange, at den af en eller anden grund siger at this.xht er undefined (selvom den ER er defined)  :(

Men ellers mange tak for dit forsøg på at hjælpe indtil videre :)
Avatar billede mclemens Nybegynder
03. april 2006 - 22:38 #10
køres handle_response() først EFTER at der i this.xht er oprettet et objekt>

- Jo, den så jeg godt, jeg mente bare at når man herefter satte xht til at være en xmlrequest nulstillede det xht og herefter ville xht først være forskellig fra undefined når status var blevet lig 4... men må da indrømme at jeg kun har læst en lille smule om det, men det var da forsøget værd... krydser fingre for at du får en løsning ;)
Avatar billede razmuz_dk Nybegynder
04. april 2006 - 00:37 #11
Jeg omskrev scriptet lidt - og nu virker det. Hovedsageligt var løsningen at jeg kaldte objektet via den absolutte "sti" i stedet "this.".
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester