Avatar billede freya1000 Nybegynder
08. december 2006 - 17:29 Der er 18 kommentarer

Forklaring på AJAX kode

Hejsa fandt noget kode som jeg kunne bruge her: http://www.eksperten.dk/spm/747578 - men vil også gerne forstå den, så hvis een ville forklare mig den ville jeg blive glad (måske b_ eller olebole ;))

Koden er her:

var xmlHttp;
var posX;
var posY;

function createXMLHttpRequest() {
  if (window.ActiveXObject) {
      xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
  }
  else if (window.XMLHttpRequest) {
      xmlHttp = new window.XMLHttpRequest();
  }
}

function startRequest(test_id, event) {
  posX = mouseX(event);
  posY = mouseY(event);
  createXMLHttpRequest();
  xmlHttp.onreadystatechange = handleStateChange;
  xmlHttp.open("GET", "hent_detaljer.php?id="+test_id, true);
  xmlHttp.send(null);
}

function handleStateChange() {
  if(xmlHttp.readyState == 4) {
      if(xmlHttp.status == 200) {
        //alert("Serveren svarede: "+ xmlHttp.responseText);
        createDivElement(xmlHttp.responseText);
      }
  }
}

function createDivElement(text) {
  removeDivElement();
  var textElem = document.createTextNode(text);
  var elem = document.createElement("div");
  elem.setAttribute("id", "detaljer");
  elem.appendChild(textElem);     
  var parentElem = document.getElementById("test");
  parentElem.appendChild(elem);

  document.getElementById("detaljer").style.width = "200px";
  document.getElementById("detaljer").style.position = "absolute";
  document.getElementById("detaljer").style.backgroundColor = "#ccccff";
  document.getElementById("detaljer").style.border = "1px solid black";
  document.getElementById("detaljer").style.padding = "10px";
  document.getElementById("detaljer").style.fontSize = "11px";
  document.getElementById("detaljer").style.left = posX+"px";
  document.getElementById("detaljer").style.top = posY+"px";
}

function removeDivElement() {
  if (document.getElementById("detaljer")) {
      var elem = document.getElementById("detaljer");
      var parentElem = document.getElementById("test");
      parentElem.removeChild(elem);
  }
}

function mouseX(evt) {
  return evt.clientX;
}

function mouseY(evt) {
  return evt.clientY;
}
Avatar billede olebole Juniormester
11. december 2006 - 10:32 #1
<ole>

Jeg giver hellere end gerne noget uddybende forklaring, men vil gerne lige vide, hvad du ikke forstår. Jeg kender dig ikke så godt, så jeg ved heller ikke så meget om, 'hvor du er' - programmeringsmæssigt  =)

/mvh
</bole>
Avatar billede freya1000 Nybegynder
11. december 2006 - 11:04 #2
Hej Ole, lyder super. Programmeringsmæssigt er jeg ikke langt hvad angår AJAX.

Men jeg kan da lige tolke det så godt som jeg kan, og så kan du eventuelt rette/slette/tilføje
Avatar billede freya1000 Nybegynder
11. december 2006 - 11:27 #3
Først oprettes der 3 variabler, derefter oprettes XML forbindelsen, og det er bl.a. den jeg ikke er sikker på. Ved at if(xmlHttp.readyState == 4) og if(xmlHttp.status == 200) er et standard oprettelse tjek?!

Stylen og mouse funktionerne forstår jeg fint, men er lidt usikker på starten af createDivElement.

P.S
Er det muligt som b_ spørger om at fx lave et linjeskift i outputtet?
Avatar billede olebole Juniormester
12. december 2006 - 14:33 #4
Der er to forskellige måder at oprette et XMLHttpRequest-objekt på ... det gør man med funktionen 'createXMLHttpRequest'.

Funktionen 'startRequest' sender request'en til serveren - og et XMLHttpRequest fyrer en event (onreadystatechange) af på forskellige tidspunkter:
    http://msdn.microsoft.com/workshop/author/dhtml/reference/events/onreadystatechange.asp?frame=true

- hvergang objektets readyState skifter:
    http://msdn.microsoft.com/workshop/author/dhtml/reference/properties/readystate_3.asp?frame=true

Samtidig skifter dets status:
    http://msdn.microsoft.com/workshop/author/dhtml/reference/properties/status_3.asp?frame=true

- samt statusText:
    http://msdn.microsoft.com/workshop/author/dhtml/reference/properties/statustext.asp?frame=true

Tag dig ikke af, at nogle af disse ting kun gælder for IE7. Det er fordi, man i IE7 skifter fra den ene til den anden metode at oprette request-objektet på. De samme ting gælder for den gamle måde at oprette objektet på (med ActiveX)  ;o)

Prøv at kikke på det i første omgang - og se så, om der er mere tåge omkring teknikken  ;o)
Avatar billede olebole Juniormester
12. december 2006 - 14:40 #5
Når objektets readyState er 4 (og det er færdig-loaded), samt dets status fortæller, at alt er gået godt (status er 200), kaldes funktionen 'createDivElement' med request-objektets retur-tekst (xmlHttp.responseText) som argument.

Her oprettes elementer med DOM og indsættes i dokumentet. Læs evt. mere om de anvendte metoder her:
    http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/createelement.asp?frame=true

    http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/createtextnode.asp?frame=true

    http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/setattribute.asp?frame=true
    http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/appendchild.asp?frame=true
Avatar billede freya1000 Nybegynder
12. december 2006 - 16:53 #6
Alletiders... Har tid imorgen, så vil sætte mig ned og kigge dine links igennem, men det ser godt ud..

Lige en sidste ting: Er det muligt som b_ spørger om at fx lave et linjeskift i outputtet? For hvis ikke ved jeg ikke hvor smart den er i mit tilfælde!!
Avatar billede olebole Juniormester
13. december 2006 - 15:17 #7
Ja, så indsætter du bare et br-element:

var oBody = document.getElementsByTagName("body")[0]; // Find elementet, der skal tilføjes indhold

var o = document.createTextNode("En linje tekst ..."); // Opret en tekst-node
oBody.appendChild(o); // Indsæt teksten

o = document.createElement("br"); // Opret et br-element
oBody.appendChild(o); // Indsæt br-elementet

var o = document.createTextNode("- og en linje tekst mere."); // Opret endnu en tekst-node
oBody.appendChild(o); // Indsæt teksten
Avatar billede freya1000 Nybegynder
13. december 2006 - 15:33 #8
Okay det sidste forstår jeg ikke helt!

I min hentdetaljer.php har jeg:
if (!isset($_GET['id']))
  exit;

$sql = "SELECT *";
$sql .= " FROM bil";
$sql .= " WHERE bil_id =". $_GET['id'];

$result = mysql_query($sql, $conn);
$row = mysql_fetch_object($result);

print $row->navn;
print " ";
print $row->beskrivelse;


Jeg vil så gerne have navn til at stå med fed, og beskrivelsen til at være nedenunder. Hvordan gøres det?
Avatar billede freya1000 Nybegynder
13. december 2006 - 15:33 #9
Du må gerne smide et svar med din næste kommentar
Avatar billede olebole Juniormester
13. december 2006 - 15:48 #10
Jeg er på vej udaf døren, men går videre med tråden imorgen. Det er dog vigtigt ikke at lægge HTML (såsom br-elementer) i databasen. Det får man kun problemer ud af på længere sigt  =)
Avatar billede freya1000 Nybegynder
14. december 2006 - 10:08 #11
Det ser jeg frem til ;)

Det vil hellere ikke hjælpe at smide et br i databasen. Det vil jo bare blive læst som tekst: navn<br />beskrivelse
Avatar billede freya1000 Nybegynder
15. december 2006 - 10:02 #12
Det er måske alligevel ikke muligt?
Avatar billede freya1000 Nybegynder
15. december 2006 - 16:36 #13
Ole min ven... HJÆÆÆÆÆÆLP
Avatar billede freya1000 Nybegynder
17. december 2006 - 14:36 #14
Jeg har prøvet alt hvad jeg kunne komme i tanke om mht linjeskift mm. men kan ikke få det til at virke, så Ole håber du har en mirakel løsning
Avatar billede freya1000 Nybegynder
18. december 2006 - 16:30 #15
Giver op nu... så Ole smid et svar
Avatar billede sw_red_6 Nybegynder
18. december 2006 - 16:35 #16
Du skulle måske prøve at ligge en besked i olebole's karma, for han brokker sig konstant over at han ikke modtager mails fra de tråde han er med i ;o)
Avatar billede olebole Juniormester
19. december 2006 - 14:40 #17
sw_red_6 >> Ja, det er korrekt - har ikke fået mail om denne tråd. Karma'en kikker jeg ret sjældent i, men keysersoze henledte tilfældigt min opmærsksomhed på den  =)

freya1000 >> Meningen er, at du enten skal XML- eller JSON-formatere dine data på serveren. Herefter sendes de tilbage til klienten, som parser resultatet og opretter/indsætter elementer.
Om du vælger XML eller JSON kan være ligemeget ... personligt foretrækker jeg dog JSON (JavaScript Object Notation), da det er ekstremt let at arbejde med på klienten. Prøv at læse min artikel om arrays og objekter i JS:
    http://www.eksperten.dk/artikler/227

- samt denne side om JSON:
    http://www.json.org/

På serveren skal du udskrive en JSON-streng - noget à la:
    print "{noget:'en tekst', nogetAndet:'en anden tekst'}";

På klienten kan du så i callback-funktionen (den du kalder 'createDivElement') skrive:

function createDivElement(text) {
    eval("var oResponse = " + text); // Opret et JS-objekt med reponse-resultatet

    alert(oResponse.noget) // Blot en test
    alert(oResponse.nogetAndet) // - og endnu en test
   
    var oBody = document.getElementsByTagName("body")[0];
   
    var o = document.createElement("i");
    var txt = document.createTextNode(oResponse.noget);
    o.appenChild(txt);
    oBody.appendChild(oBody);

    o = document.createElement("div");
    txt = document.createTextNode(oResponse.nogetAndet);
    o.appenChild(txt);
    oBody.appendChild(oBody);
}

Her klistrer jeg blot en italic tekst ind i body'en - efterfulgt af et div med noget andet tekst. Da jeg bruger et div, opstår der automatisk et linjebrud ... men jeg kunne dog også have indsat et br-element, efterfulgt af en tekst-node  =)

Håber, det hjalp lidt  ;o)
Avatar billede olebole Juniormester
19. december 2006 - 14:43 #18
Fra og med PHP 5.2.0 er JSON indbygget og enanbled  :)
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