webForumDet fria alternativet

AJAX Problem

4 svar · 351 visningar · startad av Glitter

GlitterMedlem sedan juli 2003465 inlägg
#1

Jag har gjort ett script med ajax som funkar i FF men inte i IE. Jag får "undefined" tillbaka av ajax funktionen och vet inte varför.

Koden:

function getElmById(aID){
    var element = document.getElementById ? document.getElementById(aID) : document.all[aID];
    return element;
}

function GetPage(url){
    var http = false;
    try {
        http = new XMLHttpRequest();
    } catch (trymicrosoft) {
        try {
            http = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (othermicrosoft) {
            try {
                http = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (failed) {
                http = false;
            }
        }
    }
    
    var htmlstr;
    http.open("GET", url);
    http.onreadystatechange=function() {
        if(http.readyState == 4 && http.status == 200) {
            htmlstr = http.responseText;
        }
    }
    http.send(null);
    return htmlstr;
}

function VisaDomainInfo(DomainId){
    if (getElmById('d' + DomainId).innerHTML == ""){
        getElmById('d' + DomainId).innerHTML = GetPage("domaininfo.aspx?id=" + DomainId + "");
    } else {
        getElmById('d' + DomainId).innerHTML = "";
    }
}

'd' + DomainId är en <DIV> som jag fyller.

Testade att sätta en alert() på htmlstr i Getpage(url) och då får jag det jag vill ha av funktionen men det kan jag inte ha.

Tacksam för hjälp med lösningen.

spangoMedlem sedan juni 20008 205 inlägg
#2

Det beror på att XmlHttp-saken laddas asynkront, så du vet inte när onreadystatechange kommer att anropas. Det du får göra är att du från onreadystatechange anropar någon funktion som presenterar resultatet som du vill, typ:

function GetPage(url, callback){
    var http = false;
    try {
        http = new XMLHttpRequest();
    } catch (trymicrosoft) {
        try {
            http = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (othermicrosoft) {
            try {
                http = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (failed) {
                http = false;
            }
        }
    }
    
    http.open("GET", url);
    http.onreadystatechange=function() {
        if(http.readyState == 4 && http.status == 200) {
            callback(http.responseText);
        }
    }
    http.send(null);
}
function VisaDomainInfo(DomainId){
    if (getElmById('d' + DomainId).innerHTML == ""){
        GetPage("domaininfo.aspx?id=" + DomainId + "", function (domainInfo){getElmById('d' + DomainId).innerHTML = domainInfo});
    } else {
        getElmById('d' + DomainId).innerHTML = "";
    }
}
GlitterMedlem sedan juli 2003465 inlägg
#3

Det funkar bättre men när funktionen VisaDomainInfo(DomainId) har anropats anropas en liknande funktion som skall fylla en <div> som VisaDomainInfo(DomainId) har genererat och det funkar det inte.
Felmeddelandet blir "Objekt krävs" vilket då måste innebära att den diven inte finns innan nästa funktion anropas och hur löser man det?

Jag testade att lägga det anropet till den andra funktionen på den sidan jag jag hämtar med ajax med då verkar det som skriptet inte körs.

spangoMedlem sedan juni 20008 205 inlägg
#4

Glitter skrev:

Det funkar bättre men när funktionen VisaDomainInfo(DomainId) har anropats anropas en liknande funktion som skall fylla en <div> som VisaDomainInfo(DomainId) har genererat och det funkar det inte.

Nej, och det är inte så konstigt eftersom allt som förlitar sig på resultatet från en XmlHttp-request måste göras i callbacken, d.v.s. anropas direkt eller indirekt från onreadystatechange eftersom exekveringen som initierar requesten inte väntar på att requesten ska fullföljas. Så det du får göra är att lägga till ett anrop av den funktionen i denna kodsnutt:

GetPage("domaininfo.aspx?id=" + DomainId + "", function (domainInfo){getElmById('d' + DomainId).innerHTML = domainInfo});

så att det blir typ...

var callback = function (domainInfo){
    getElmById('d' + DomainId).innerHTML = domainInfo;
    [B]AnropaDinAndraFunktionHär();[/B]
}
GetPage("domaininfo.aspx?id=" + DomainId + "", callback);
GlitterMedlem sedan juli 2003465 inlägg
#5

ha ha ja det är klart...
tack för hjälpen

134 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)