Avatar billede Wawki Nybegynder
09. marts 2011 - 19:49 Der er 10 kommentarer og
1 løsning

Ajax - POST med Return

Hejsa Exp,

Jeg kunne rigtig godt tænke mig en "universal" AJAX funktion på min siden, som kunne benyttes fra flere af mine forms.

Således jeg kan sende data med POST til en PHP side som så returnere et "OK" eller en fejl-beskrivelse.

Min kode virker bare ikke efter planen, kan det ikke lade sig gøre at "returne" resultatet i funktionen med POST ? Det virker fint når jeg bruger GET nemlig, hvilket jeg ikke forstår.

Her er min ajax kode:

function ajaxPostReturn(url,parameters) {
    var xmlHttp;
    try {
        // Firefox, Opera 8.0+, Safari
        xmlHttp=new XMLHttpRequest();
    }
    catch (e)
    {
        // Internet Explorer
        try
        {
            xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch (e) {
            try {
                xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch (e) {
                alert("Your browser does not support AJAX!");
                return false;
            }
        }
    }
   
    xmlHttp.open('POST', url, true);
   
    xmlHttp.onreadystatechange=function() {
        if(xmlHttp.readyState == 4) {
            var output = xmlHttp.responseText;
            return output;
            //alert(output);
        }
    }
    xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    xmlHttp.send(parameters);
}
Avatar billede heinzdmx Nybegynder
09. marts 2011 - 20:03 #1
I stedet for at kæmpe med hvordan du laver browser kombatibilitet så ville jeg i stedet på jQuery til det, det kan gøres meget nemmere, alt der indeholder javascript. jQuery fylder 50 kb og hvis du henter det fra en CDN som f.eks. Google så vil det muligvis allerede være på besøgenes browsers cache.

http://api.jquery.com/jQuery.ajax/
Avatar billede Wawki Nybegynder
09. marts 2011 - 20:12 #2
@heinzdmx
Jo tak :) Har også tænkt lidt på det - men mit eneste formål er at kunne POST noget data fra en form til en PHP side og få svaret retur.

Jeg går ud fra at jQuery´s ajax kan langt mere som jeg alligevel ikke har brug for ?

Lige var tanken at min ajaxPostReturn() funktion skulle være på alle sider, og så på de enkelte sider ville jeg have en funktion til at indsamle form data og sende til ajaxPostReturn(), og så få svaret tilbage der. Forstår bare ikke hvorfor jeg ikke kan returne responseText med POST når det virker fint med GET ?

Mon virkelig jQuery skal være løsningen på det ? Uden at blive alt for omfattende :)
Avatar billede heinzdmx Nybegynder
09. marts 2011 - 20:17 #3
Avatar billede Wawki Nybegynder
09. marts 2011 - 20:25 #4
Fint eksempel :) Men der sendes data direkte fra Ajax funktionen til elementet sådan her:

document.getElementById("result").innerHTML=mygetrequest.responseText

Det jeg bare ønsker at kunne er:

return mygetrequest.responseText

------------
Det fungere bare ikke, og jeg vil så gerne vide om det kan gøres anderledes :)
Avatar billede heinzdmx Nybegynder
09. marts 2011 - 20:32 #5
Evt kunne du sætte returnteksten i en global værdi altså:


var returnValue = "";

... en masse javascript her ...

.. ajax

returnValue = mygetrequest.responseText;
... javascript


På den måde kan du jo tilgå det i forskellige funktioner i hvertfald.
Avatar billede tjens Nybegynder
09. marts 2011 - 21:05 #6
#4: Du kan ikke lave return i onreadystatechange callback funktionen.

Den kører først når der kommer svar, og her er din funktion ajaxPostReturn færdig med at køre.

Så du skal enten skifte fra asynkront til synkront, eller bruge en dynamisk callback funktion, så du modtager svaret i rette context.
Avatar billede intenz Novice
09. marts 2011 - 21:11 #7
Du kan ikke bruge returnere data fra en ajax funktion med return. Ajax er asynkront, så svaret kommer ikke tilbage med det samme. Den typiske måde at gøre det på, er at lave din egen callback funktion.

Du skal bruge et nyt parameter på din ajaxPostReturn funktion. Ændre til f.eks.:

function ajaxPostReturn(url,parameters, callback) {


Du skal så kalde det parameter som funktion, når dit data returnerer.

    xmlHttp.onreadystatechange=function() {
        if(xmlHttp.readyState == 4) {
            callback(xmlHttp.responseText);
        }
    }


Når du kalder din funktion, kan du så sende en anonym funktion med som 'callback' funktion.

ajaxPostReturn('en_url','nogle parametre', function(data) {
    // gør noget med det data der kommer tilbage.
    alert(data);
})


Inde i callback funktionen kan du så gøre hvad du vil med data'et. Men du kan stadig ikke returnere noget fra funktionen.
Avatar billede Wawki Nybegynder
09. marts 2011 - 21:16 #8
Tusind tak - den løsning kunne godt bruges :)
Er allerede afprøvet og det spiller ;)
Avatar billede olebole Juniormester
09. marts 2011 - 21:43 #9
<ole>

Der er kun tale om Ajax, hvis request'en er asynkron - og husk i øvrigt, at ved Ajax HTML formaterer man ikke data på serveren, men i browseren. Det er en komplet - men skræmmende udbredt - misforståelse af Ajax. Derved slipper du også ganske behændigt udenom brugen af innerHTML, som indebærer nogle svære uhensigtsmæssigheder.

I stedet formaterer serveren data som XML eller JSON, som browseren parser - for efterfølgende at formatere og indsætte disse data i siden med DOM.

Endelig må jeg påpege, at det er en rigtig god idé at lære skrive sin egen Ajax kode - så man lærer, hvad teknologien faktisk går ud på. I følge min erfaring er det kun et ganske lille fåtal af jQuery brugere, der kan prale med det  ;o)

/mvh
</bole>
Avatar billede heinzdmx Nybegynder
09. marts 2011 - 21:50 #10
Misforstå mig ikke, det kan være meget smart at kende den teknik der ligger bag. Men hvad er det forkerte i at man ikke kender det helt bagvedliggende princip så længe man kender til det princip der hedder kør en funktion, registrer et callback, og så på callback'et er der data man kan bruge?

For mig er jQuery en hjælp til at lave noget der virker i alle browsere på en forholdvis enkel måde. Og koden kan skrives kortere fordi jQuery gør det muligt at lave noget der ikke fylder så meget.
Avatar billede olebole Juniormester
09. marts 2011 - 22:12 #11
Ja, og det tage kun få minutter at varme en micro-pizza ... men den har udover 5 bogstaver på pakken intet med en pizza at gøre! Du giver køb på kvalitet for at få komfort.

Der er masser i jQuery, der er skrevet yderst uhensigtsmæssigt, og du har ikke kontrol over, hvad det gør ved din resulterende kode. Hvis man bare vil skrive hurtig kode, betyder det selvfølgelig ikke noget, meeeeeen ...  ;o)

Derudover kender jeg ikke jQuery-folk, der samtidig er gode JavaScriptere. Hvis de var det, ville de selv skrive koden, da det er yderst sjældent, jQuery er hurtigere at skrive til, hvis man er dygtig til JS/DOM.
Samtidig er der ingen hjælp fra jQuery til den endnu ikke så dygtige JS'er. I stedet for at øve sig i JavaScript/DOM sidder han og bøvler med en fuldstændig proprietær syntaks.

Bare til en begyndelse frarådes det i ECMA standarden (som bl.a. er grundlaget for sprog som JavaScript og ActiopScript) at benytte $ i variabelnavne, da tegnet i ECMAScript sammenhæng er forbeholdt maskinkode.

jQuery's mest grundlæggende funktion hedder som bekendt netop $ - så allerede fra første linje arbejdes der på at degradere koderens gode kodeskik. Og det er som sagt kun begyndelsen  ;o)

Men der er både kunder til micro-pizza og oppustelige vinyldukker med 'oh-hooo-mund' og nylonparyk ... så det er der naturligvis også til jQuery  =)
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