• 1
  • 2
2006-12-12, 16:59
  #1
Medlem
Lyckholms avatar
Hej,

Jag använder XMLHttpRequest för att läsa resultatet av ett PHP-anrop från Javascript.
XMLHttpRequest skickar iväg förfrågan och jag kan se att PHP svarar med en enkel textsträng "mintest". Men xmlhttp.responseText är helt tom. Den innehåller ingenting.

Däremot är xmlhttp.status == 200 så hämtningen lyckades uppenbarligen.

Måste man returnera äkta XML? Dvs en korrekt XML-header och allting inom taggar? Eller fungerar det med en enkel textsträng också, exempelvis "mintest"?

Så här ser koden ut (Javascript):

Kod:
function GetAlternatives(thealts) {
    LoadXMLDoc("http://...mypage.php?alts=" + thealts);
}
function LoadXMLDoc(url) {
    xmlhttp = null;
    if( window.XMLHttpRequest ) {
        xmlhttp = new XMLHttpRequest();
    }
    else if( window.ActiveXObject ) {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    if( xmlhttp != null ) {
        xmlhttp.onreadystatechange = State_Change;
        xmlhttp.open("GET", url, true);
        xmlhttp.send(null);
    }
    else {
        // Browser does not support XMLHTTP.
    }
}
function State_Change() {    
    if( xmlhttp.readyState == 4 ) {      // if xmlhttp shows "loaded"
        // if "OK"
        if( xmlhttp.status == 200 ) {
            // OK........ men här är xmlhttp.responseText helt tom.
        }
        else {
            // Problem retrieving data
        }
    }
}
Citera
2006-12-12, 20:56
  #2
Medlem
herons avatar
Vad är det du postar in?

Så här hade jag gjort:

Kod:
function createRequestObject() {
    var ro;
    var browser = navigator.appName;
    if(browser == "Microsoft Internet Explorer"){
        ro = new ActiveXObject("Microsoft.XMLHTTP");
    }else{
        ro = new XMLHttpRequest();
    }
    return ro;
}



var http = createRequestObject();

function GetAlternatives(thealts) {

var url='mypage.php?alts=' + thealts;
    http.open('GET', url , true);
    http.onreadystatechange = handleResponse;
    http.setRequestHeader("Content-Type", "text/xml");
    http.send(null);

}

function handleResponse() {
if (http.readyState==4 || http.readyState=="complete")
{ 
	document.getElementById("testa").innerHTML=http.responseText;
} 
}
Citera
2006-12-13, 14:31
  #3
Medlem
Lyckholms avatar
Hmm. Jo, det ser ju bra ut. Fattar bara inte varför inte min fungerade? Jag satte inte requestheader. Kanske man borde göra det...
Citera
2006-12-13, 14:44
  #4
Medlem
herons avatar
Citat:
Ursprungligen postat av Lyckholm
Jag satte inte requestheader. Kanske man borde göra det...

Precis, vill du iaf köra med din så fungerar den här:

Kod:
function GetAlternatives(thealts) {
    LoadXMLDoc("mypage.php?alts=" + thealts);
}
function LoadXMLDoc(url) {
    xmlhttp = null;
    if( window.XMLHttpRequest ) {
        xmlhttp = new XMLHttpRequest();
    }
    else if( window.ActiveXObject ) {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    if( xmlhttp != null ) {
        xmlhttp.onreadystatechange = State_Change;
        xmlhttp.open("GET", url, true);
        xmlhttp.setRequestHeader("Content-Type", "text/xml");
        xmlhttp.send(null);
    }
    else {
        // Browser does not support XMLHTTP.
    }
}
function State_Change() {    
    if( xmlhttp.readyState == 4 ) {      // if xmlhttp shows "loaded"
        // if "OK"
        if( xmlhttp.status == 200 ) {
            document.getElementById("testa").innerHTML=xmlhttp.responseText;
        }
        else {
            // Problem retrieving data
        }
    }
}
Citera
2006-12-13, 14:47
  #5
Medlem
Lyckholms avatar
Min klant. Jag hade glömt att printa ut resultatet på serversidan. Jag räknade ut allting men returnerade det aldrig till standard out. Inte så konstigt att ingenting hände
Citera
2006-12-13, 16:31
  #6
Medlem
Ni bör även kolla så att inte eran XMLHttpRequest är upptagen när ni gör nytt anrop. Om man återanvänder en ej ledig XMLHttpRequest krashar ajax-funktionaliteten och kräver en sidreload för att fungera igen.
Testa att anropa ajaxfunktionen frenetiskt ett tag så kommer ni att få felmeddelande från javadebuggern och scriptet avslutas.

Ändra
Kod:
if( xmlhttp != null ) {

till
Kod:
if( xmlhttp.readyState==0 || xmlhttp.readyState==4 ) {
Citera
2006-12-13, 16:56
  #7
Medlem
Lyckholms avatar
Citat:
Ursprungligen postat av tajson
Ni bör även kolla så att inte eran XMLHttpRequest är upptagen när ni gör nytt anrop. Om man återanvänder en ej ledig XMLHttpRequest krashar ajax-funktionaliteten och kräver en sidreload för att fungera igen.
Testa att anropa ajaxfunktionen frenetiskt ett tag så kommer ni att få felmeddelande från javadebuggern och scriptet avslutas.

Ändra
Kod:
if( xmlhttp != null ) {

till
Kod:
if( xmlhttp.readyState==0 || xmlhttp.readyState==4 ) {

Kanonbra att du påpekade det. Den var lurig. Men egentligen ska man väl kolla både om den är skild från null och din check. Så här:

Kod:
if( xmlhttp != null ) {
     if( xmlhttp.readyState==0 || xmlhttp.readyState==4 ) {
        ....
    }
}
Citera
2006-12-13, 17:17
  #8
Medlem
blueCommands avatar
Själv gör jag så här för att undvika krockar:

Kod:
function FillData(divID,url)

{

	var xmlreq = CreateXMLReq();

	xmlreq.onreadystatechange = function() { XMLChange(divID,xmlreq) };

	xmlreq.open("GET", url,true);

	xmlreq.send("");	

}

function XMLChange(divID,xmlreq)

{

	if( xmlreq.readyState == 4 )

	{

		var nd = GetDiv(divID);

		nd.innerHTML = xmlreq.responseText;



		delete xmlreq;

	}

}
Citera
2006-12-13, 17:51
  #9
Medlem
Lyckholms avatar
Alla sätt är bra utom de tråkiga.
Citera
2006-12-14, 17:18
  #10
Medlem
Citat:
Ursprungligen postat av Lyckholm
Kanonbra att du påpekade det. Den var lurig. Men egentligen ska man väl kolla både om den är skild från null och din check. Så här:

Objektet kan inte vara null om man tittar enbart efter readyState 0 eller 4.
Din koll kan vara bra att använda om du vill se om klienten ej kunde skapa ett gilltigt XMLHttpRequest-objekt. I din kod blir det kaka på kaka då du redan har funktionalitet för det:

Kod:
else {
        // Browser does not support XMLHTTP.
    }

Förslagsvis kan du avsluta funktionen med en return där.
Citera
2006-12-14, 18:27
  #11
Medlem
Lyckholms avatar
Citat:
Ursprungligen postat av tajson
Objektet kan inte vara null om man tittar enbart efter readyState 0 eller 4.
Din koll kan vara bra att använda om du vill se om klienten ej kunde skapa ett gilltigt XMLHttpRequest-objekt. I din kod blir det kaka på kaka då du redan har funktionalitet för det:

Kod:
else {
        // Browser does not support XMLHTTP.
    }

Förslagsvis kan du avsluta funktionen med en return där.

Vad yrar du om?

Du kan inte titta på readyState om du inte ens har ett objekt. Det är god programmerings-sed att alltid kolla om man har ett objekt först innan man tittar på dess properties eller anropar dess metoder.

Du antar att State_Change endast anropas om man har ett xmlhttp-objekt. Ja, men förutsatt att den ej anropas från någon annanstans.

Återigen: Det är god programmerings-sed att försäkra sig om man har något att titta på överhuvudtaget innan man gräver i det.
Citera
2006-12-14, 18:46
  #12
Medlem
Citat:
Ursprungligen postat av Lyckholm
Du kan inte titta på readyState om du inte ens har ett objekt. Det är god programmerings-sed att alltid kolla om man har ett objekt först innan man tittar på dess properties eller anropar dess metoder.
I javascript med flera kan du, men som du själv säger, det är inte en snygg lösning och inte det jag menade att du skulle göra.

Citat:
Ursprungligen postat av Lyckholm
Du antar att State_Change endast anropas om man har ett xmlhttp-objekt. Ja, men förutsatt att den ej anropas från någon annanstans.
Avsluta funktionen helt i första if-satsen där du har en kommentar "Browser does not support XMLHTTP". Varför dubbelkolla objektet? Bara onödig dublettkod som tar upp plats och exekveringstid.
Citera
  • 1
  • 2

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in