Avatar billede farving Nybegynder
27. marts 2007 - 21:48 Der er 12 kommentarer og
1 løsning

this.xmlHttp has no properties

Hej eksperter

Nu er jeg igen stødt på et problem. Jeg er ved at lave mig et lille standard "bibliotek" som kan spare mig for en masse gentagen af kode. Men jeg får bare en irriterende meddelse i error consolen i Firefox, og gætter på fejlen er ens i Explorer... Nogen der kan forklare hvorfor?

Koden:
function getXmlHttpObject() {
    this.xmlHttp = (window.ActiveXObject) ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
    this.xmlHttp.onreadystatechange = this.readyStateChanged;
    this.output = "";
}
getXmlHttpObject.prototype.sendRequest = function (reqMethod, page) {
    if (this.xmlHttp == null) {
        alert("You\'r browser doesn\'t support AJAX");
        return false;
    } else if (reqMethod && page != "") {
        this.xmlHttp.open(reqMethod, page, true);
        this.xmlHttp.send(null);
    }
    return this.output;
}
getXmlHttpObject.prototype.readyStateChanged = function() {
alert(this.xmlHttp.readyState);
    switch (this.readyState) {
        case 0:
            //strTime += "Readystate 0: " + time + "ms<br />"
        break
        case 1:
            //strTime += "Readystate 1: " + time + "ms<br />"
        break
        case 2:
            //strTime += "Readystate 2: " + time + "ms<br />"
        break
        case 3:
            //strTime += "Readystate 3: " + time + "ms<br />"
        break
        case 4:
            alert(this.xmlHttp.responseText);
            this.output = this.xmlHttp.responseText;
        break
    }
}
Error fejlen:
Error: this.xmlHttp has no properties
Line: 17

Mvh Carsten
Avatar billede roenving Novice
27. marts 2007 - 22:04 #1
Men opretter du nogensinde objektet ?-)

var xmlHttp = new getXmlHttpObject();
Avatar billede farving Nybegynder
04. august 2007 - 19:20 #2
Det skulle jeg da mene...

Jeg tilskriver this.xmlHttp objected som bliver valgt ud fra om window.ActiveXObject retunerer true eller false?

Ellers har jeg misforstået noget...

Og især undskyld for det sene svar, må have overset Mailen :(

Mvh Carsten
Avatar billede thesurfer Nybegynder
04. august 2007 - 19:27 #3
Hvis du nu skulle bruge koden, kan denne del

    switch (this.readyState) {
        case 0:
            //strTime += "Readystate 0: " + time + "ms<br />"
        break
        case 1:
            //strTime += "Readystate 1: " + time + "ms<br />"
        break
        case 2:
            //strTime += "Readystate 2: " + time + "ms<br />"
        break
        case 3:
            //strTime += "Readystate 3: " + time + "ms<br />"
        break
        case 4:
            alert(this.xmlHttp.responseText);
            this.output = this.xmlHttp.responseText;
        break
    }

omskrives til:

    if (this.readyState == 4)
    {
        alert(this.xmlHttp.responseText);
        this.output = this.xmlHttp.responseText;
    } else {
        strTime += "Readystate " + this.readyState + ": " + time + "ms<br />";
    }

Jeg lagde også mærke til "<br />", hvilket indikerer at du vil kode op mod XHTML.
De kloge siger, at XHTML ikke understøttes ordentligt, og det derfor frarådes.

I stedet før man bruger HTML 4.01.. evt i Strict mode, men helst almindelige Loose..
Avatar billede farving Nybegynder
04. august 2007 - 20:23 #4
Well det var bare test, og meningen er at de forskellige cases skal gøre forskellige ting ;)

Og <br /> har aldrig givet problemer, så tvivler stærkt på det skaber nogen problemer :)

Og måske understøttes XHTML ikke ordentligt, men har ikke stødt ind i problemer med den smule jeg har brugt - endnu

// carsten
Avatar billede olebole Juniormester
04. august 2007 - 22:11 #5
<ole>

Prøv:

function getXmlHttpObject() {
    var me = this;
    this.xmlHttp = (window.ActiveXObject) ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
    this.xmlHttp.onreadystatechange = function(){me.readyStateChanged()};
    this.output = "";
}

/mvh
</bole>
Avatar billede farving Nybegynder
06. august 2007 - 23:25 #6
Det ser ud til at virke, men hvorfor?

// Carsten
Avatar billede olebole Juniormester
06. august 2007 - 23:42 #7
Fordi, du befinder dig i to forskellige scopes. Du kan prøve at tjekke, hvilket objekt, du sigter på med keyword'et 'this', når du bruger:
    this.xmlHttp.onreadystatechange = this.readyStateChanged;

I din callBack-handler skriver du:

getXmlHttpObject.prototype.readyStateChanged = function() {
    var a = [];
    for (var x in this) a.push(x + " => " + this[x]);
    alert(a.join("\n"));
    return;
   
    ... osv - osv ...
}
Avatar billede farving Nybegynder
07. august 2007 - 02:25 #8
Så events kan ikke trigger en method?

Den skal trigger en funktion som så kan kalde en method?

Men ellers kan jeg godt se hvorfor det skal være me og ikke this, selvom me også burde være et andet scope?

// Carsten
Avatar billede farving Nybegynder
03. maj 2008 - 19:02 #9
Længe siden, hvis du smider et svar så får du point :)

Hvertfald lidt at tænke på...

Mvh Carsten
Avatar billede olebole Juniormester
03. maj 2008 - 21:32 #10
"Men ellers kan jeg godt se hvorfor det skal være me og ikke this, selvom me også burde være et andet scope?" >> 'this' er knyttet til det scope, hvori det bruges. Brugte jeg 'this' i stedet for 'me' i den anonyme funktion, ville jeg referere til det globale scope. På det tidspunkt, hvor den anonyme funktion afvikles, refererer 'this' ikke til objektet  =)
Avatar billede farving Nybegynder
05. maj 2008 - 19:18 #11
Okay, lidt indviklet for mig tror jeg... Men kan godt se logikken...

Men tak for hjælpen :)

Mvh Carsten
Avatar billede olebole Juniormester
05. maj 2008 - 20:59 #12
- og tak for points  ;o)
Avatar billede farving Nybegynder
05. maj 2008 - 23:18 #13
Var så lidt da ;)

Mvh Carsten
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