Avatar billede majbom Novice
10. april 2008 - 20:30 Der er 24 kommentarer og
1 løsning

AJAX-script opdaterer ikke

hej experter

sidder og leger med ajax for første gang, og indtil videre virker det fint nok, men jeg har alligevel et problem.

jeg har en php-fil som ajax-scriptet kører og får svar fra, det virker også, første gang. lad os sige at php-filen blot echo'er tiden (echo date(H:i);) og det er det, så får jeg samme tid hver gang jeg henter indholdet af filen via ajax, medmindre jeg lige går ind på php-siden manuelt så den skriver den rigtige tid, så henter den så dén tid og spytter ud.

det er lidt svært at forklare, men det er som om at den cacher resultatet fra php-filen, og genbruger det...

pft
Avatar billede olebole Juniormester
10. april 2008 - 20:41 #1
<ole>

I Ajax bruger man ikke GET ... og det lyder det, somom du gør. Har du lært det i en tutorial, kan du godt gå udfra, at resten af det, du kalder Ajax, sikkert heller ikke har meget med Ajax at gøre. Det er overodentlig let at finde tutorials om 'Ajax' - men ligeså overordentlig svært at finde noget, der består af god og valid kode  ;o)

/mvh
</bole>
Avatar billede majbom Novice
10. april 2008 - 20:47 #2
ja, der bliver brugt GET - hvad skal jeg så bruge? POST?

jeg har godt hørt at der er mange elendige tuts derude...
Avatar billede majbom Novice
10. april 2008 - 20:50 #3
Avatar billede olebole Juniormester
10. april 2008 - 21:01 #4
Nej, det hører også - sammen med kæmpe tabel-helveder som layout-værktøj - hjemme i midten af 1990'erne. Property'en innerHTML er et invalidt og rigtig skidt levn fra version 4 browserne. Den bør under ingen omstændigheder bruges til andet end test idag, hvor der findes langt bedre metoder til manipulering af sidens DOM-træ.

Læs evt. min artikel om innerHTML:
    http://www.dengodekode.dk/artikler/DOM/no_innerhtml.php

Derudover har jeg skrevet en XMLHttpRequest wrapper:
    http://www.dengodekode.dk/artikler/ajax/xmlhttprequest_wrapper.php

- som jeg viser i brug sammen med JSON i denne tråd:
    http://www.eksperten.dk/spm/817625

- og ja, du bør bruge POST  ;o)
Avatar billede majbom Novice
10. april 2008 - 21:06 #5
okay jeg vil lige læse artiklen igennem, har godt hørt at det ikke var godt at bruge innerHTML, men har ikke kunne finde ud af hvordan jeg ellers skulle gøre det, det håber jeg der er svar på i din artikel, ellers bliver jeg skuffet :)

tak for hjælpen, so far
Avatar billede olebole Juniormester
10. april 2008 - 21:24 #6
Så bliver du nok skuffet. Helt simple ting kan du lære på overskuelig tid, men skal løsningen bare være en anelse mere kompleks, kan det tage år. Ajax er noget af det mest komplicerede, du kan kode til brug i en browser  =)
Avatar billede majbom Novice
10. april 2008 - 21:42 #7
ja det blev jeg...

nå jeg må lige tænke over hvad jeg skal så, men selve POST-delen i linket (20:50:08) er god nok? hvis jeg ser bort fra innerhtml-delen...
Avatar billede majbom Novice
10. april 2008 - 21:47 #8
du skulle ikke tilfældigvis kende en god bog omhandlende DOM? :)

eller anden form for litteratur...
Avatar billede olebole Juniormester
10. april 2008 - 22:01 #9
Nej, jeg har selv lært det ved hjælp af referencer, dokumentation, reallife-, mail- og forumdiskussioner og oceaner af spredte informationer om allehånde sprog- og browser-særheder.

Hvad er det mere præcist, du skal lave? Er der blandet event handlers ind i de elementer, der skal indsættes?
Avatar billede majbom Novice
10. april 2008 - 22:09 #10
okay, så må jeg se om jeg kan finde noget brugbart.

jamen jeg er ved at lave en side hvor man skal kunne tilføje produkter til en database, og jeg tænkte at det var en mulighed for at lære lidt ajax. jeg ved godt at det nemt kan laves uden, men jeg vil jo gerne lære det så...

jeg har f.eks. en form, der når man trykker submit, kører noget javascript til at tjekke felternes indhold og hvis indholdet bliver godkendt, skal det sendes til databasen. det er det med at sende til databasen jeg gerne ville lave i ajax, så man bliver på siden. igen mest bare for at lære det, for jeg har nemmere ved at lave det på den "gammeldags" måde, med rent html og php...
Avatar billede olebole Juniormester
10. april 2008 - 23:25 #11
Det kan du sagtens. Du kunne jo skrive noget à la:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Ajax Eksempel :: [http://www.eksperten.dk/spm/817625]</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script type="text/JavaScript">
(function(){if(window.XMLHttpRequest)return;var o=null,s,a=["MSXML2.XMLHTTP.6.0","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP"];for(var i=0,j=a.length;i<j;s=a[i],i++){try{if(o=new ActiveXObject(s))break}catch(e){}}window.XMLHttpRequest=o?function(){return new ActiveXObject(s)}:null;o=null})();

function AjaxReq(sMethod, sUrl, oVars, fnCallBack) {
    var oHttp = new XMLHttpRequest();
    oHttp.open(sMethod, sUrl, true);
    oHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=utf-8");
    oHttp.onreadystatechange = _fnCallBack;
    var aQuery = [];
    for (var x in oVars) aQuery.push( encodeURIComponent(x) + "=" + encodeURIComponent(oVars[x]) );
    oHttp.send( aQuery.join("&") );
    aQuery = null;
    fnCallBack()
   
    function _fnCallBack() {
        if (oHttp.readyState<4) return;
        fnCallBack(oHttp);
        oHttp = null;
    }
    return this;
}

function myCallBack(oHttp) {
    document.getElementById("msgDispl").firstChild.nodeValue = oHttp.responseText;
}

function sendAjaxReq(oF) {
    var oVars = {};
    oVars.context = oF.context.value;
    oVars.navn = oF.navn.value;
    oVars.email = oF.email.value;
    for (var i=0,j=oF.sex.length; i<j; i++) {
        if (oF.sex[i].checked) {
            oVars.sex = oF.sex[i].value;
            break;
        }
    }
    oF.reset();
    new AjaxReq("POST", oF.getAttribute("action"), oVars, myCallBack);
    document.getElementById("msgDispl").firstChild.nodeValue = "Sender ...";
    oVars = null;
}
</script>
</head>
<body>

<p id="msgDispl" style="font:bold 12px tahoma,sans-serif">&nbsp;</p>

<form action="http://www.domain.dk/sti/til/fil.php" onsubmit="sendAjaxReq(this);return false;">
<input type="hidden" name="context" value="insert">
<p>Navn: <input type="text" name="navn"></p>
<p>E-mail: <input type="text" name="email"></p>
<p>Køn: <input type="radio" name="sex" id="male" value="m" checked="checked"><label for="male">m</label>&nbsp;&nbsp;&nbsp;&nbsp;
    <input type="radio" name="sex" id="female" value="k"><label for="female">k</label></p>
<p><button type="submit">Indsæt</button></p>
</form>

</body>
</html>

Så har du $_POST["context"], $_POST["navn"], $_POST["email"] og $_POST["sex"] på serveren. Hvad du skriver ud til 'fil.php' bliver sat ind i det første p-element - men det må kun være en tekststreng ... ikke HTML. Skal det HTML-formateres bliver det lidt mere indviklet, men ikke nødvendigvis meget  :)
Avatar billede majbom Novice
12. april 2008 - 08:14 #12
hej ole, undskyld jeg ikke har svaret før. jeg synes det meste giver mening, bortset fra denne stump:

fnCallBack()
function _fnCallBack() {
  if (oHttp.readyState<4) return;
  fnCallBack(oHttp);
  oHttp = null;
}

jeg kan ikke rigtig se hvad fnCallBack gør...

en anden ting; lad os sige at det jeg modtager fra php-filen er html-formateret, hvad skal der så til, for at på vist det? jeg tænker blot på kursiv og fed tekst, ikke noget med forms osv.
Avatar billede roenving Novice
12. april 2008 - 11:46 #13
fnCallBack er jo en reference til myCallBack, der medsendes som parameter til funktionen !-)
Avatar billede majbom Novice
12. april 2008 - 12:53 #14
hmm, kan godt se at jeg ikke er helt så meget inde i javascript som jeg troede :S

altså denne linje laver en instans af "AjaxReq", right?

new AjaxReq("POST", oF.getAttribute("action"), oVars, myCallBack);

men den sidste parameter er "myCallBack" som er en funktion, men den bliver ikke kaldt med paranteser.

tilgengæld er der

fnCallBack() - uden semikolon..

for mig virker det som om at den sender funktionen myCallBack med som parameter, hvilket jeg ikke kan se formålet med. hvis funktionen myCallBack skal bruges i AjaxReq, hvorfor så ikke bare kalde den derfra?
Avatar billede roenving Novice
12. april 2008 - 12:57 #15
Fordi den er lavet så generisk, at du kan lave flere forskellige ajax-kald og der lave forskellige ting, f.eks. opdatere forskellige meddelelsesbokse ...
Avatar billede roenving Novice
12. april 2008 - 13:19 #16
-- at der ikke er semikolon er ligegyldigt, da der kommer et linjeskift, men med oles normale kodestil er det sikkert en forglemmelse ...

-- og fordi der i kaldet ikke er paranteser på, bliver det kun til en reference, var de der, ville funktionen blive udført umiddelbart (og det er jo så ikke hensigtsmæssigt !-)
Avatar billede majbom Novice
12. april 2008 - 14:26 #17
okay, så havde jeg ret i min teori, men hvorfor sende den med og ikke bare kalde den i AjaxReq();?
Avatar billede roenving Novice
12. april 2008 - 14:43 #18
For at kunne lave forskellige kald !-)
Avatar billede majbom Novice
12. april 2008 - 16:53 #19
-> roenving - det forstår jeg ikke lige forstå, men fuck det :)

-> ole - er det meningen at den først skal vise indholdet af felterne i <p>'en og derfter åbne fil.php?
Avatar billede olebole Juniormester
13. april 2008 - 23:50 #20
Er lige kommet ind ad døren fra Jylland og et besøg hos mit mellemste barnebarn (noget er vigtigere end Jer - sorry to say ;), så jeg har en truckload af nyt-i-tråd-mails fra E liggende i min inbox. Jeg besvarer dem i løbet af mandag/tirsdag ... jeg har ikke glemt dig  ;o)
Avatar billede majbom Novice
14. april 2008 - 20:53 #21
helt i orden ole, men jeg er godt nok skuffet over ikke at være i første række ift. din familie ;)
Avatar billede olebole Juniormester
17. april 2008 - 01:03 #22
Konstruktionen skyldes, at jeg gerne vil nøjes med én funktion (eller rettere ét object) til afsendelse af server requests - AjaxReq. Til gengæld vil jeg formodentlig behandle serverens response på forskellig måde ved forskellige requests. Derfor har jeg gjort det muligt at medsende en reference til forskellige callback funktioner til request objektet.

Havde jeg kaldt én og samme funktion inde fra request objektet, ville jeg skulle skelne mellem de forskellige slags requests i callback funktionen. Den valgte løsning gør skalering betydeligt lettere.

- og ja, det manglende semikolon var naturligvis en forglemmelse  ;o)
Avatar billede majbom Novice
17. april 2008 - 08:06 #23
okay fint nok...

jeg har fået det til at virke ved at ændre i min egen funktion, så den nu bruger POST og det virker bare.

mht. dit forslag tidligere, virker det ikke helt, den går videre til fil.php og i fil.php er det kun 'context' og 'sex' der indeholder noget...
Avatar billede majbom Novice
21. april 2008 - 21:27 #24
nå jeg fandt som sagt en anden løsning, dog har jeg valgt at bruge innerhtml, da det umiddelbart er det nemmeste, jeg ved godt at det ville være bedre at bruge dom, men jeg har ganske enkelt ikke tid til at sættemig ind i det lige nu, og jeg tror ikke at det bliver noget problem, da det ikke blier noget stort, og ikke ret meget data...

smid et svar ole, så kan vi dele lidt :)
Avatar billede majbom Novice
06. maj 2008 - 12:58 #25
nå, så napper jeg dem selv...

tak for hjælpen
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
Kurser inden for grundlæggende programmering

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