Avatar billede anderskm Nybegynder
24. januar 2010 - 22:38 Der er 6 kommentarer og
2 løsninger

Ajax problem

Long time listener, first time caller :-)
Jeg er lige begyndt at lege med ajax, og har i min kode taget udgangspunkt i følgende eksempel: http://www.w3schools.com/Ajax/ajax_database.asp
Mit script består af 3 filer i følgende mappe struktur:
index.php
getRelativeInfo.php
js/ajax.js

Index.php er den fil, der skal opdateres vha. ajax.
getRelativeInfo.php inde holder koden, der laver forespørgslen til databasen.
ajax.js indeholder (sjovt nok :P) mit javascript. Se koden nedenfor.

// kode start

var xmlhttp

function getRelativeInfo(objId,rid,info)
{
    //create a new XMLHttpRequest
    if (window.XMLHttpRequest)
    {
        // code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    }
    if (xmlhttp==null)
    {
        alert ("Your browser does not support AJAX!");
        return;
    }
    var url="getRelativeInfo.php";
    url=url+"?rid="+rid;
    url=url+"&info="+info;
//    alert(url);
    xmlhttp.onreadystatechange=stateChanged(objId);
    xmlhttp.open("GET",url,true);
    xmlhttp.send(null);
}
function stateChanged(objId)
{
//    document.getElementById(objId).value = xmlhttp.readyState;
    if (xmlhttp.readyState==4)
    {
        document.getElementById(objId).value = info;
    }
}

// kode slut

Hvis jeg indkommenterer linien i funktionen stateChanged, kan den fint opdaterer input elementets value, men readystate er altid 0.
Jeg har sat filen, getRelativeInfo.php til altid at returnere en fast værdi. <? echo('bob'); ?>
Jeg er lidt på bar bund, men hvad fejlen i mit script kan være.
På forhånd tak for hjælpen.
/Anders
Avatar billede mike2002 Nybegynder
24. januar 2010 - 22:44 #1
Tester du lokalt? Da jeg første gang legede med AJAX startede jeg med det samme eksempel og sad og rodede rundt med det samme problem (tror jeg). Og så vidt jeg husker, virkede scriptet fint, da det først kom op på en live server at ligge.
Prøv det!
/Michael
Avatar billede anderskm Nybegynder
24. januar 2010 - 23:06 #2
Jeg tester det live på mit domæne, der er hostet hos servage.net, så det kan ikke være fejlen :-)
Avatar billede Slettet bruger
24. januar 2010 - 23:43 #3
Må jeg anbefale dig at bruge et Javascript framework, som f.eks. jQuery?
De fleste Javascript frameworks gør det let at lave AJAX som virker i alle browsere.
Avatar billede mike2002 Nybegynder
24. januar 2010 - 23:46 #4
Har du tjekket rettigheder for filen. Der er jeg ikke super stærk, men du kan jo altid prøve at starte med at sætte den til 777 (fuld rettigheder - læse, skrive, udføre). Hvis det virker, så prøv at sætte den til 644.
Avatar billede anderskm Nybegynder
25. januar 2010 - 09:16 #5
kimsey0:
Jeg har tænkt på det, men jeg ville gerne have en god forståelse for ajax inden jeg begynder på et framework. Men hvis det stadig ikke virker sidst på dagen, er det nok den løsning jeg ender med.

mike2002:
Rettighederne er som standard 644. Har lige prøvet at sætte dem op til 777 på alle 3 filer, men dette hjalp desværre heller ikke.

Er der en der kan overskue om selve koden ser rigtig ud? og om mappe strukturen er rigtig? Skal getRelativeInfo.php ligge i samme mappe som ajax.js eller index.php?
Avatar billede Cyrilion Nybegynder
25. januar 2010 - 10:44 #6
Tror dit problem ligger her:

xmlhttp.onreadystatechange=stateChanged(objId);

onreadystatechange er en eventhandler, så du kan ikke umiddelbart sende et parameter med uden at det fungere som et funktionskald.

stateChanged(objId) bliver altså kaldt med det samme i stedet for når xmlhttp.readyState rent faktisk er ændret.

Der er to muligheder:

//Kode start (objId ud som global variabel)

var objId;

function getRelativeInfo(oId,rid,info)
{
    objId = oId;
    //create a new XMLHttpRequest
    if (window.XMLHttpRequest)
    {
        // code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    }
    if (xmlhttp==null)
    {
        alert ("Your browser does not support AJAX!");
        return;
    }
    var url="getRelativeInfo.php";
    url=url+"?rid="+rid;
    url=url+"&info="+info;
//    alert(url);
    xmlhttp.onreadystatechange=stateChanged;
    xmlhttp.open("GET",url,true);
    xmlhttp.send(null);
}

// Kode slut

eller

// Kode start (Brug af anonym function som eventhandler)

function getRelativeInfo(objId,rid,info)
{
    //create a new XMLHttpRequest
    if (window.XMLHttpRequest)
    {
        // code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    }
    if (xmlhttp==null)
    {
        alert ("Your browser does not support AJAX!");
        return;
    }
    var url="getRelativeInfo.php";
    url=url+"?rid="+rid;
    url=url+"&info="+info;
//    alert(url);
    xmlhttp.onreadystatechange=function(){stateChanged(objId)};
    xmlhttp.open("GET",url,true);
    xmlhttp.send(null);
}

// Kode slut

(Tag dette med forbehold. Jeg har ikke testet det ;) )
Avatar billede anderskm Nybegynder
25. januar 2010 - 11:14 #7
Cyrilion:
Fandt også frem til at problemet lå i xmlhttp.onreadystatechange=stateChanged(objId);
Jeg har dog valgt en anden løsning end dem du foreslår, hvor jeg via URL'et sender objId til getRelativeInfo.php, som derefter returnerer det igen samme med informationerne. objId og informationerne er separeret af %#%, for let at kunne skilne de to ting fra hinanden.
Den endelige kode ses nedenfor.

// kode start

var xmlhttp

function getRelativeInfo(objId,rid,info)
{
    //create a new XMLHttpRequest
    if (window.XMLHttpRequest)
    {
        // code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    }
    if (xmlhttp==null)
    {
        alert ("Your browser does not support AJAX!");
        return;
    }
    var url="getRelativeInfo.php";
    url=url+"?rid="+rid;
    url=url+"&info="+info;
    url=url+"&objId="+objId;
    url=url+"&sid="+Math.random();
    document.getElementById(objId).value = "Retreiving info...";
    xmlhttp.onreadystatechange=stateChanged;
    xmlhttp.open("GET",url,true);
    xmlhttp.send(null);
}
function stateChanged()
{
    if (xmlhttp.readyState==4)
    {
        var response = xmlhttp.responseText.split("%#%");
        document.getElementById(response[0]).value = response[1];
    }
}

// kode slut

Cyrilion smid et svar, så får du halvdelen af pointene. Sætter resten på dette indlæg, da det var denne løsning jeg har brugt.
Avatar billede Cyrilion Nybegynder
25. januar 2010 - 11:34 #8
Så længe det virker. :)

Dog lige et lille hint. Hvis du arbejder dig ret meget længere ind i den løsningsmodel, burde du nok kigge på xml som response format.

(Ingen grund til at genopfinde den dybe tallerken og alt det der).
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



IT-JOB

Udviklings- og Forenklingsstyrelsen

Projektledere til nyetableret PMO-kontor

Udviklings- og Forenklingsstyrelsen

ITSM-koordinator

Udviklings- og Forenklingsstyrelsen

Business Analyst med flair for test

Cognizant Technology Solutions Denmark ApS

Test Architect - Projects