Avatar billede sovetryne Nybegynder
26. februar 2012 - 22:11 Der er 18 kommentarer og
1 løsning

Hvordan virker "get" i jQuery?

Hej eksperter.

Jeg har følgende kode:
<script language="Javascript">
function startprocedure()
  {
    $.get('gnoquotes.php', function(data)
      {
      example = data;
      });
    alert(example);
  }
</script>
<script language="Javascript">
var example;
startprocedure();
setInterval(function()
  {
  startprocedure();
  },5000);
</script>

Forklaring: når siden bliver læst ind, gennemføres function "startprocedure". Efter min mening skal den gøre følgende:
1. Returner data fra gnoquotes.php
2. Put dataene i en variable ("example")
3. Vis en textbox med indholdet af "example".

Det virker ikke den første gang, men først den anden gang. Hvad gør jeg forkert?
Avatar billede sovetryne Nybegynder
26. februar 2012 - 22:16 #1
Også hvis jeg fjerner "startprocedure();" under "var example;" virker den først den anden gang.

Jeg gætter på at det er noget med en forkert rækkefølge, jeg har et problem med.
Avatar billede sovetryne Nybegynder
26. februar 2012 - 22:48 #2
Jeg beklager min ivrige skriveri, men har forenklet scriptet lidt:

<script language="text/javascript">
var example;
$.get('test.php', function(data)
  {
  $('.result').html(data);
  example = data;
  alert('Load was performed.');
  });
</script>
<script language="Javascript">
alert(example);
</script>

Hvis jeg ser det rigtigt, skulle den FØRST sige "Load was performed", og bagefter komme med en besked med indholdet af "example", men den synes åbenbart at det skal være omvendt. Hvad gør jeg forkert???
Avatar billede softspot Forsker
26. februar 2012 - 22:55 #3
Nej, for $.get er asynkron, dvs. koden umiddelbart efter kaldet til $.get sandsynligvis vil blive udført før $.get vender tilbage med svar fra den adresse du har kaldt (og udfører den anonyme funktion du har defineret til at fylde data i example).

Sekvensen er altså umiddelbart korrekt nok.
Avatar billede sovetryne Nybegynder
26. februar 2012 - 23:19 #4
Tak softspot. Det forklarer en hel del :)
Hvordan kan jeg klare det synkron?
Avatar billede sovetryne Nybegynder
26. februar 2012 - 23:20 #5
Du har krav på pointsene i hvert fald... :)
Avatar billede softspot Forsker
26. februar 2012 - 23:34 #6
Jeg har faktisk ikke brugt jQuery's AJAX i synkron tilstand - det går lidt imod princippet i AJAX (som jo er Asyncronous Javascript And XML), men jeg mener der kan sættes en option, hvir man angiver det skal være synkron. Se evt. efter ajaxoptions på docs.jquery.com/Main_Page for mulighederne med jQuery.

Hvad er årsagen til at du vil gøre det synkront?
Avatar billede sovetryne Nybegynder
26. februar 2012 - 23:40 #7
Tak. Jeg ved at det er imod AJAX-princippet, men det går ud på, at man skal kunne lægge en besked (eller en status update, hvad man nu kalder det) ind, som dukker op "live". Derfor bruges en script, som kører hver 5 sekunder. Folk skal kunne reagere på de der status updates, og det skal også ses live.
Avatar billede softspot Forsker
26. februar 2012 - 23:44 #8
OK, men det behøver det vel ikke være synkront for at man kan...?
Avatar billede sovetryne Nybegynder
26. februar 2012 - 23:47 #9
Hehe, vist ikke, men jeg har genskrevet min php/javascript/jquerry så mange gange, at jeg ikke ved hvordan jeg ellers skal gøre det....
Avatar billede softspot Forsker
26. februar 2012 - 23:49 #10
Kan du være mere specifik ang. hvordan det skal fungere? Det kan være jeg (eller andre her på sitet) kan hjælpe dig med at få det gjort asynkront...
Avatar billede sovetryne Nybegynder
27. februar 2012 - 00:01 #11
Jeg vil prøve:

Websitet har flere brugere. Når man logger på, kommer man først på "body.php".
Der har man en form, hvor man kan skrive en besked, men der er ikke en submit-function - det gør jeg via javascript (HTTPRequest).
Når det er sket, kommer ens besked lige under form'en. Også når en anden person, som man er abonneret på, skriver en besked, skal den dukke op, på samme måde.
Under ens besked er der også en form (med HTTPRequest), hvor man kan reagere på beskeden, lige som mange social networks. Og en reaktion skal også dukke op automatisk efter den er lagt i databasen af brugeren eller en af brugerens kontakter.

Håber det giver mening
Avatar billede sovetryne Nybegynder
27. februar 2012 - 00:13 #12
Det, jeg havde tænkt mig er følgende:

Jeg har en <div id="messages"></div>

Så bruger jeg en funktion, som henter alle beskeder som man selv har skrevet og dem, der er skrevet af ens kontakter, fra databasen, og lægger det ind i div'en. Så kører der hver 5. sekund en function, som finder ud af hvilke beskeder ligger i databasen, men som ikke er hentet endnu. Disse beskeder bliver så tilføjet. Desuden checker den, om der er beskeder slettet, og de bliver så også usynliggjort på siden. Altså enhver besked får også en egen div kaldet "message_" samt ID'en af databasen.

Desuden kører der også en check-function hver 5. sekund for at hente alle reaktioner.
Avatar billede olebole Juniormester
27. februar 2012 - 01:13 #13
<ole>

Det ville da være vanvittigt at hente alle de samme data hvert femte sekund. Én gang må være nok - og derefter henter man kun de beskeder, brugeren endnu ikke har set. Derudover HTML-formaterer man ikke data på serveren. Det performer også elendigt.

Kik i jQuery's dokumentation efter getJSON. Med den hentes data som JSON og returneres som et JS-object. Data ligger nu i dette objekt, og du kan så indsætte HTML-elementer med data fra objektet i dokumentet.

På serveren opretter du et objekt - f.eks. med:

$json = new stdClass();

$json kan du så oprette forskellige properties, hvis værdier udgøres af de data, du ønsker at returnere. Hvis du f.eks. ønsker at returnere nogle fundne MySQL-rækker, kan du skrive noget i stil med:

$json->rows = array();

- og når du henter rækkerne, henter du dem som objekter og sætter dem ind i array'et:

while ($row = mysql_fetch_object($res)) {
    $json->rows = $row;
}

Til allersidst sætter du de andre properties, du måtte have brug for, sætter headers og udskriver du JSON-strengen:

$json->stamp = time();
$str_json = json_encode($json);
header('Content-Type: application/json; charset=utf-8');
header('Content-Length: ' . strlen($str_json));
echo $str_json;

Når du næste gang kalder PHP-dokumentet medsender du det timestamp, du returnerede fra serveren. Det ligger i getJSON's JS-objekt som data.stamp. Men som sagt: Tjek dokumentationen  *o)

Når PHP-dokumentet kaldes, henter du kun de beskeder, som er oprettet efter det medsendte stamp (alle beskeder skal være indsat sammen med et timestamp for oprettelsen). Hvis der ikke er medsendt noget stamp, må det være første gang, der hentes - og så skal hele dynen hentes og returneres.

/mvh
</bole>
Avatar billede olebole Juniormester
27. februar 2012 - 01:14 #14
Ups, jeg havde glemt et par brackets:

while ($row = mysql_fetch_object($res)) {
    $json->rows[] = $row;
}
Avatar billede sovetryne Nybegynder
27. februar 2012 - 09:04 #15
Hej Ole,

Tak for din udførlige besked, det kan jeg absolut bruge. Jeg har ikke endnu erfaring med $json, men kan godt se at det giver mening.

Men det er klart at den ikke skal hente al data hver femte sekund. Det er også derfor at den tjekker hvilke beskeder allerede ligger på siden, og kun henter de beskeder, som der ikke endnu ligger, og evt. fjerner beskederne, som er fjernet fra db'en.

Den henter dog ikke HTML-formaterede data fra serveren, det kommer ind via en slags ajax-agtig procedure, og hentes som javascript-variabler, hvorefter javascript lægger det i de rigtige tabeller/objekter.

Tusind tak for hjælpen indtil videre.

Jeg er ikke verdens bedste programmør, men jeg er overbevist om, at jeg kan lave en sådan side - men det kræver at jeg hører på hvad andre siger.

Albert
Avatar billede sovetryne Nybegynder
28. februar 2012 - 23:51 #16
Hej Ole,

Jeg har løst det uden json. Egentligt skrev jeg min besked, fordi jeg 4x havde genskrevet hele min "body.php" (som egentligt ikke indeholder så meget PHP, haha), og det ville bare ikke lykkes for mig. Til sidst greb jeg tilbage til en gammel body.php, hvor det hele blev hentet ned gennem PHP. Den byggede jeg ud med en autoupdater. Og bagefter kunne jeg fjerne næsten hele PHP-delen. Jeg tror faktisk at, selvom du skrev noget andet, at du mellem linjerne har hjulpet mig en hel del. Så tak for det. Hvis du vil have points, så sig til, vi finder nok noget ud af med at oprette et spørgsmål og tildele dig pointsene.

Albert
Avatar billede olebole Juniormester
29. februar 2012 - 00:04 #17
Ellers tak, jeg samler ikke point. Læg selv et svar og accepter det, så tråden lukkes.

Vil det sige, at du nu henter HTML-formaterede data?
Avatar billede sovetryne Nybegynder
29. februar 2012 - 08:21 #18
@Olebole

Nej da, det kunne jeg ikke drømme om. Der er en lille bitte ting som kommer HTML-formateret: et link til ens profil, når man har reageret på et eller andet. Men det er for at undgå at php-filen, hvor jQuery'en henter sin data fra, først kigger i databasen hvem der "synes godt om" en bestemt bemærkning, sender ID som javascript-variable tilbage til jQuery'en, som efterfølgende skal lave en query i MySQL hvem ID'et er og lave det om til et link til vedkommendes profil. Så er det nemmere hvis jQuery'ens kilde finder frem til ID'en, finder ud af hvad vedkommende hedder, laver et link til vedkommendes profil, og sende lortet tilbage til jQuery'en. Men det er også det eneste som der bliver sendt HTML-formateret, resten bliver bygget op af Javascript, efter det er hentet hjem af jQuery.
Avatar billede olebole Juniormester
29. februar 2012 - 16:25 #19
Så forstår den gamle mand meget bedre - sætter sig ned og behersker sin hyperventilation ... pyyhhhhhh ...  *D
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

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