www.Happy-Security.de präsentiert: Einstieg in AJAX-Programmierung Autor: Tsutomu Katsura Datum: 26. Mai 2006 Herzlich willkommen zu meinem kleinen Tutorial über AJAX-Programmierung. Ich möchte hier nicht allzu viel auf die Geschichte von AJAX eingehen, sondern einfach nur eine Festigung geben, wenn jemand noch neu auf diesem Gebiet ist. Für alle, die jedoch noch gar nichts von AJAX gehört haben, hier eine kurze Info: Früher wurden Daten, die man für die Verarbeitung in JavaScript benötigt immer auf Vorrat gespeichert und so ergab sich eine sehr große Datenmenge, die oftmals nie benutzt wird. Mit AJAX (Asynchronous JavaScript and XML) wird nun die Möglichkeit geboten, spezifische Daten vom Server nachzufordern, ohne dass der Benutzer dies merklich spürt. Im Großen und Ganzen bedeutet dies, dass eine Webseite nicht vollständig neu geladen werden muss, was ergo viel benutzerfreundlicher und effizienter im Umgang mit Traffic-Resourcen ist. Doch Obacht! Es ist nicht immer Ratsam, eine Technik wie AJAX zu benutzen, nur weil Sie neu erscheint. Weitere Informationen zu der Technik, die hinter AJAX steht, gibt es auf Wikipedia. Ich möchte nun Anhand eines Bewertungsscripts für Bilder zeigen, auf welche Art Resourcen gespart werden und eine schnelle Interaktion zwischen Client und Server erstellt werden kann. Dieses Beispiel ist natürlich nur sehr kurz gefasst und lässt sich noch weiter ausbauen (ist hierfür nun aber nicht nötig). Zunächst einmal erstellen wir folgende Datei namens „index.html“: 1. <html> 2. <head> 3. <title> 4. AJAX-Tutorial von Happy-Security.de 5. </title> 6. <script type"text/javascript"> 7. function vote4it(id,value) 8. { 9. var nwl = (screen.width-150)/2; 10. var nwh = (screen.height-150)/2; 11. vote=window.open('vote.php?id='+id+'&value='+value, 'Artikel12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Bewertung', 'width=150,height=150,left='+nwl+',top='+nwh+''); vote.window.focus(); } </script> </head> <body> <div style="text-align:center"> Bewerten Sie meinen Artikel:<br /> Langer Text <br /> ... <br /> und noch viel viel mehr mit <br /> Bildern und so was über sehr <br /> 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. viele Zeilen lang <br /> <p> <form name="voteform"> <b>Bewertung:</b> <select name="rating"> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> </select> <input type="button" name="submit" value="SET" onclick="javascript:vote4it('113', document.voteform.rating.value)"> </form> </p> </div> </body> </html> Am Ende dieser Datei (Ab Zeile 25) befindet sich ein sehr einfaches Formular mit einem Select-Feld, das die Ziffern von 1-5 zur Auswahl bereitstellt. Wählt man nun eine dieser Optionen aus und klickt auf „SET“, so wird die Funktion vote4it in JavaScript aufgerufen. So weit unterscheiden sich beide Varianten nicht von einander. Erst jetzt gibt es einiges zu beachten. Als erstes jedoch der Aufbau mit JavaScript und dem Aufrufen einer externen PHP-Datei, die alles verarbeitet. Wie man im Javascript erkennen kann, wird ein Pop-Up ( Zeile 11) geöffnet und die Variablen $id sowie $value mit ans PHP-Script gesendet. So wird schon mal nicht unser Hauptfenster neu geladen und man kann nahezu ungestört weiterlesen. Was jedoch, wenn man einen Pop-Up Blocker hat? Da tauchen die ersten Probleme auf. Mit AJAX wäre das nicht passiert ^_^ Schauen wir uns nun einmal an, was auf der PHP-Seite normalerweise nun gemacht wird. 1. <?PHP 2. $id = $_REQUEST['id']; 3. $value = $_REQUEST['value']; 4. 5. if(!is_numeric($id) OR !is_numeric($value)) exit; // error-handling 6. 7. mysql_connect('localhost','root','passwort') or die('connect error'); 8. mysql_select_db('test') or die('db error'); 9. 10. mysql_query("UPDATE test_table SET punkte = punkte+".$value.", stimmen = stimmen+1 WHERE id = ".$id); 11. 12. $bewertung_sql = mysql_query("SELECT * FROM test_table WHERE id = ".$id); 13. $bewertung = mysql_fetch_array($bewertung_sql); 14. 15. echo "Der Artikel hat ". ($bewertung[punkte]/$bewertung[stimmen])." Punkte"; 16. 17. ?> Zum einfachen Schutz wird erstmal in Zeile 5 kontrolliert, ob die Eingabe auch legitim ist. Wir wollen nur Zahlen erlauben, also wird alles was !is_numeric ist zum Abbruch der Scripts führen. Sehr einfach; Sehr effektiv. Der wichtigste Teil ist hier Zeile 10 und 12. In Zeile 10 werden die Daten zur Datenbank weitergeleitet und dort gespeichert. Später in Zeile 12 wird der aktuelle Stand von dem Artikel mit $id ausgelesen und per echo() ins html geschrieben. Dies war die normale Methode, also bringen wir nun AJAX ins Spiel um das Ganze etwas aufzubereiten. Zunächst einmal müssen wir die alte Funktion vote4it() rausnehmen und ab Zeile 7 das folgende einfügen. Eine Erklärung dieses Scripts kommt im Anschluss. 1. var resObjekt; 2. 3. if(navigator.appName.search("Microsoft") > -1) { 4. resObjekt = new ActiveXObject("MSXML2.XMLHTTP"); 5. } 6. else { 7. resObjekt = new XMLHttpRequest(); 8. } 9. 10. function sndReq(value) { 11. id = document.voteform.id.value; 12. resObjekt.open('get', 'vote.php?id='+id+'&value='+value, true); 13. resObjekt.onreadystatechange = handleResponse; 14. resObjekt.send(null); 15. } 16. 17. function handleResponse() { 18. if(resObjekt.readyState == 4) { 19. document.getElementById('output').innerHTML = resObjekt.responseText; 20. } 21. } Außerdem müssen wir das Formular ein wenig umbauen. Statt dem alten Formular nehmen wir also dieses mal den folgenden Teil hier und fügen ihn an dieselbe Stelle ein, wo auch das alte Formular war. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. <form name="voteform"> <b>Bewertung:</b> <input type="hidden" name="id" value="2"> <select name="rating"> <option onClick="sndReq(1)">1</option> <option onClick="sndReq(2)">2</option> <option onClick="sndReq(3)">3</option> <option onClick="sndReq(4)">4</option> <option onClick="sndReq(5)">5</option> </select> </form> <span id="output"></span> Das war eigentlich auch schon alles. Nun können wir das Script testen. Wenn die Seite geladen wurde, haben wir unten das Select-Feld (diesmal ohne Button zum Senden der Eingabe. Wählt man nun aus den gegebenen Optionen eine Zahl aus, so wird dieser Wert per sndReq()-Befehl ans JavaScript übergeben und dort weiterverarbeitet. Und hier fängt AJAX an zu arbeiten. Damit der weitere Ablauf auch funktioniert, müssen wir unserem Browser nun ein Plugin geben, damit die Befehle auch richtig interpretiert werden können. Dies geschieht im Internet Explorer mit: resObjekt = new ActiveXObject("MSXML2.XMLHTTP"); und in allen anderen Browser mit: resObjekt = new XMLHttpRequest(); Wie man sieht, arbeitet hier Microsoft noch mit ActiveX als Konstruktor zur Erzeugung des XMLHttpRequest Objekts und sollte dadurch natürlich nur die zweite Wahl beim Surfen sein ^^ Aber was erzähle ich denn das... So etwas ist ja mittlerweile doch eigentlich überall bekannt. Da Microsoft wie üblich einen anderen Weg wählt, müssen wir zur korrekten Einbindung des Objektes eine Browserweiche wie am Anfang des neuen JavaScripts zu sehen ist, einbauen. Man könnte zwar mit anderen Kriterien als if(navigator.appName.search("Microsoft") > -1) schauen, ob der benutzte Browser ein Microsoft-Produkt ist oder nicht, aber diese Möglichkeit ist recht einfach gehalten. Kommen wir jetzt zum Herzstück unserer neuen Anwendung. Die Funktion, die für das Senden unserer Anfrage erstellt worden ist heißt sndReq(value) und wird ausgeführt, sobald man eine Auswahl im select-feld getätigt hat. value ist der Wert aus dem soeben ausgewählten Select-Feld und wird in den nächsten vier Zeilen unserer Funktion mit der $id unseres Artikels an den Server gesendet. Dies sind nämlich jetzt die wichtigen AJAX-Teile, die bei jeder Client-Server Verbindung benutzt werden müssen. resObjekt.open('get', 'vote.php?id='+id+'&value='+value, true); Wie unschwer zu erkennen, wird über das Objekt resObjekt die Funktion open() mit drei Parametern aufgerufen. Der erste Parameter beschreibt die Art des Sendens vom Request. Entweder geschieht dies über GET oder POST. Meistens wird im HTML von Seitens des Browsers automatisch beim Senden von Formulardaten die Methode GET gewählt, da diese sehr einfach zu handlen ist. Dies erkennt man beim Surfen daran, dass in der Adresszeile die Variablen an die Adresse drangehangen werden. Beispiel: > http://www.happy-security.de/vote.php?id=1&value=5&submit=absenden Hier ist die Datei vote.php und id, value sowie submit sind die Variablen die zum Server zur Verarbeitung gesendet werden. Bei der Methode POST werden diese Daten in eine Umgebungsvariable gepackt und im HTTP-Header mit versendet. Man muss hier beachten, dass GET eine Begrenzung der Adresszeile als Schutz vorgesehen hat und die ein paar Einschränkungen setzt. Für unseren Fall beim Senden der Anfrage jedoch noch mehr als ausreichend. Als zweites steht dort die Adresse, damit unsere Funktion auch weiß mit wem wir Verbindung aufnehmen wollen. Der Wert true am Ende gibt an, dass die Verbindung asynchron stattfinden soll. Dies beschreibt eine wichtige Eigenschaft von AJAX, wie es bereits im Namen steht. Würde dort false stehen, so würde es synrchon laufen und unser Script würde so lange pausieren, bis die Kommunikation zwischen Client und Server abgeschlossen ist. Dies kann manchmal schon etwas länger dauern (so 2-3 Sekunden – was in Ladezeit recht viel ist) und ist nicht der Sinn von Dynamik ;) Als nächstes kommen wir zu einer Kontrollfunktion: resObjekt.onreadystatechange = handleResponse; Mit der ebigen Quelltext-Zeile kommt ein neuer wichtiger Punkt von AJAX hinzu. HandleResponse ist eine Funktionsreferenz und dient in unserem Fall zum Kontrollieren, ob alle gewünschten Daten vom Server beim Client angekommen sind und nun endlich weiter verarbeitet werden können. 1. function handleResponse() { 2. if(resObjekt.readyState == 4) { 3. document.getElementById('output').innerHTML = resObjekt.responseText; 4. } 5. } Dies ist der Inhalt unserer Funktion und in Zeile 2 wird gewartet bis Status = 4 (completed) ist. Die anderen drei Möglichkeiten wären: 1 = LOADING (request-object erstellt aber kein send() ), 2 = LOADED (Anfrage gesendet und Antwort-Header kann ausgewertet werden) 3 INTERACTIVE (es werden gerade noch Daten empfangen, ziemlich kritischer Status bei nicht Beachtung). Wenn also nun der Status 4 erreicht ist und alles komplett beisammen ist, kann in JavaScript mit den empfangenen Daten weitergearbeitet werden. Dies geschieht in unserem Fall folgendermaßen: document.getElementById('output').innerHTML = resObjekt.responseText; Die Eigenschaft responseText enthält die Daten vom Server. Dies sind unsere Daten, die wir jetzt an ein Element unserer Webseite mit der ID „output“ schicken und so dem Besucher unserer Seite wieder zur Verfügung stellen. Man könnte den output zwar noch weiter in JavaScript bearbeiten und sogar noch mal zum Server senden, aber das macht bei unserer einfachen Aufgabe keinen Sinn. Ok, ich glaube nun beinahe, dass diese Erklärung ein wenig zu tief in die Details des Scripts eingegangen sind, aber so ist jeder Punkt eigentlich hoffentlich verständlich und es können wie ersten Abwandlungen anhand dieser Aufgabe geschaffen werden. Denn viel mehr ist es eigentlich nicht, was AJAX so besonders macht ;) Und Nachschlagewerke gibt es im Internet genügend. Ich hoffe ich konnte mal wieder etwas lehrreiches vermitteln und freue mich schon auf Kommentare zu diesem Tutorial auf www.happy-security.de im Gästebuch oder Forum oder auf www.digitallibrary.de.vu in unserem Bücher-Archiv. Sicherlich wird AJAX in Zukunft nicht nur für Spielereien sehr nützlich sein, sondern auch in vielen Firmen sehr gefragt werden. Also alle, die später gerne als Programmierer oder Webdesigner arbeiten wollen, sollten flugs Ihre Kenntnisse in AJAX vertiefen. Es wird sehr nützlich sein, das kann ich beschwören. In diesem Sinne: Life is a game; C u next level ;) geschrieben von Tsutomu Katsura für www.Happy-Security.de