Layoutprobleme? - Styleswitcher!
![]() |
| | Themen-Optionen |
| | Nach oben #1 |
|
Beiträge: n/a
| Vorwort In den Anfangszeiten des Webs waren die meisten Seiten statisch, einige Seiten haben mit simplen CGI Anwendungen etwas Interaktivität geboten. Die Wandlung von statischen Inhalten zu komplett dynamisch generierten Webseiten war somit nur eine Frage der Zeit. Dieses Tutorial beschreibt, wie man seine Webapplikationen um ein Element erweitern kann: asynchrone Interaktion mit dem Benutzer. Was solltest du wissen / können ... Du solltest Grundkenntnisse in HTML, fortgeschrittene Kenntnisse in JavaScript und gute Kenntniss des HTTP Protokolls besitzen. Was ist AJAX? Um es einfach auszudrücken: AJAX (Asynchronous JavaScript And XML) ermöglicht es Inhalte dynamisch nachzuladen, ohne dass die komplette Seite neu geladen werden muss. AJAX ist keine Programmiersprache sondern besteht aus verschiedenen Technologien und ist auch nicht nur annähernd so schwer zu erlernen. AJAX besteht aus:
Das XMLHttpRequest Objekt Im Grunde dreht sich alles um das XMLHttpRequest Objekt, das im Hintergrund die eigentliche Arbeit verrichtet. Das XMLHttpRequest Objekt gibt es in seiner heutigen Form seit dem Mozilla 0.9.7 und seit Internet Explorer 5.0. Im Internet Explorer ist es allerdings ein ActiveX Objekt. Da sich der ActiveX-Bezeichner von Version zu Version ändert, muss man bereits bei der Erzeugung des XMLHttpRequest Objekts eine Fallunterscheidung einbauen. Allerdings ist das API (Application Programming Interface) in jedem Browser gleich und man kann sich somit auf die eigentliche Aufgabe konzentrieren und muss sich nicht mit aufwendigen Fallunterscheidungen herumschlagen. XMLHttpRequest in den verschiedenen Browsern
PHP-Code: Einen Request an den Server senden Um nun wirklich einen Request an den Server zu senden, werden wir uns ebenfalls eine Methode schreiben nämlich sendRequest. PHP-Code: Wichtig: In JavaScript gibt es auch noch die Methode encodeURI(). Der Unterschied zwischen encodeURIComponent() und encodeURI() ist, dass ersteres auch noch die Zeichen , ? / : @ & = + $ URL kodiert. Deshalb sollte encodeURIComponent() verwendet werden.XMLHttpRequest.open(sMethod, sUrl [, bAsync] [, sUser] [, sPassword]) Diese Methode weist dem „unerledigten“ Request die Übertragungsmethode (GET,POST,PUT,HEAD), die Zielurl und optional einen boolschen Wert zu, der besagt ob eine asynchrone Operation ausgeführt werden soll oder nicht: true=ja, false=nein. Der Standardwert ist true. Wenn bAsync auf true gesetzt ist, so muss auch dem Attribut XMLHttpRequest.onreadystatechange eine Callback Methode übergeben werden, in unserem Fall sendRequest_callback,welche bei jeder Änderung des „ready states“ aufgerufen wird. Es gibt fünf verschiedene „ready states“, die übrigens über das Attribut XMLHttpRequest.readyState abgefragt werden können. Die möglichen Bearbeitungszustände im Detail:
Wichtig: Es ist zu beachten, dass aus Sicherheitsgründen und vor allem zur Vermeidung von XSS- und DoS-Angriffen die im Request (Anfrage) verwendete URL den gleichen Server bzw. Hostnamen enthalten muss wie die URL der Seite selbst.XMLHttpRequest.onreadystatechange Dieses Attribut steht nur zur Verfügung wenn in XMLHttpRequest.open der Parameter bAsync auf true gesetzt wurde. Dem Attribut wird eine Callback Methode zugewiesen die bei jeder Änderung des Bearbeitungszustandes der Transaktion/Anfrage aufgerufen wird d.h. bei jeder Änderung des „ready states“. Warum es Sinn macht onreadystatechange zu verwenden, wird später erleutert. XMLHttpRequest.send( [varBody]) Sendet grundsätzlich eine HTTP Anfrage an einen Server und erhält eine Antwort vom Server z.B. reinen Text, ein XML Dokument oder ähnliches. Der optionale Parameter varBody ist bei einem GET Request mit NULL und bei einer POST oder PUT Anfrage eben mit den gewünschten Werten zu füllen. In diesem ersten Teil des AJAX Tutorials werden nur GET Requests behandelt und diese noch nicht komplett d.h. POST ist für uns derzeit uninteressant. Wie komme ich nun an die Daten des Reponse? Nachdem eine Anwort vom Server erhalten wurde stehen die erhaltenen Daten in XMLHttpRequest.responseText als reiner Text und in XMLHttpRequest.responseXML als XML Document Object Model (DOM) Objekt zur Verfügung. Der Einfachheit halber werden wir hier nur responseText verwendet. Auf die Daten werden wir in der Methode sendRequest_callback zu greifen. Es ist allerdings auch möglich den Parameter bAsynch auf falsezu setzen und einfach nach dem Aufruf von XMLHttpRequest.send auf die Daten zuzugreifen. PHP-Code: Das Backend Jetzt wird sich vielleicht jemand die Frage stellen wie das Backend Script d.h. das Script an das die Anfrage gesendet wird und das die Antwort sendet aussieht bzw. aussehen könnte. In unserem Fall wäre das ja http://localhost/index.php. Es reicht grundsätzlich schon das die Datei existiert und nichts ausgibt d.h. XMLHttpRequest.responseText wäre dann leer bzw. NULL. Das würde aber nicht sehr sinnvoll sein und deshalb findet hier meistens eine Datenbankabfrage oder ähnliches statt. Theoretisch könnte man auch nur eine Anfrage an eine HTML Datei oder XML Datei senden. Dann würden eben immer nur die gleichen Daten zurückgegeben. Ein Beispiel für index.php PHP-Code: Ich hoffe, dass ich mit diesem Tutorial die Grundlagen von AJAX verständlich erklärt habe. Es wurden aber bei weitem nicht alle Möglichkeiten bzw. Methoden und Attribute des XMLHttpRequest Objekts vorgestellt. Deshalb werden sofern es meine Zeit erlaubt noch weitere Tutorials folgen. Nachfolgend der komplette JavaScript Code: HTML-Code: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <meta name="keyword" content="" /> <meta name="description" content="" /> <meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1" /> <script type="text/javascript"> <!-- var xhttp; function createXMLHttpRequest() { if (window.ActiveXObject) { try { // IE 6 and higher xhttp = new ActiveXObject("MSXML2.XMLHTTP"); } catch (e) { try { // IE 5 xhttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { xhttp=false; } } } else if (window.XMLHttpRequest) { try { // Mozilla, Opera, Safari ... xhttp = new XMLHttpRequest(); } catch (e) { xhttp=false; } } } function sendRequest() { if (!xhttp) { alert("An Error occured when trying to initialize XMLHttpRequest!"); return; // exit } var q = document.getElementById("q").value; q = encodeURIComponent(q); xhttp.open("GET","http://localhost/index.php?q="+q,true); xhttp.onreadystatechange=sendRequest_callback; xhttp.send(null); } function sendRequest_callback() { alert ( xhttp.readyState); if (xhttp.readyState==4 && xhttp.status==200) alert ( xhttp.responseText ); } function init() { createXMLHttpRequest(); } window.onload=init; // --> </script> </head> <body> <form method="get" action="<?php echo basename(__FILE__);?>"> <!-- Nachdem eine Taste gedrückt und wieder losgelassen wurde wird sendRequest() aufgerufen onkeypress wäre zu früh. Man könnte noch eine Verzögerung von z.B. 200ms einbauen, damit nicht bei jedem Tastendruck sondern z.B. nur bei jedem zweiten ein Request gesendet wird. --> <input onkeyup="javascript:sendRequest();" type="text" id="q" name="q" size="20" /> </form> </body> </html> Es ist immer nett wenn man eine Antwort kriegt um zu wissen ob das Tutorial auch hilfreich ist. MfG Fat Tony Geändert von Jay (05.06.2006 um 18:27 Uhr). Grund: Tippfehler ausgebessert |
|
| | Nach oben #2 |
| Benjamin Klaile Registriert seit: 02.12.2004 Ort: Remagen
Beiträge: 3.812
| Eventuell ebenfalls hilfreich für einen Einstieg in das Thema AJAX: Auch in deutscher Sprache verfügbar: Geändert von Ben (08.12.2006 um 23:53 Uhr). |
| | |
![]() |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
| Themen-Optionen | |
| |
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| [Rezension] Einführung in die Spieltheorie | Ben | Literatur | 3 | 06.06.2006 15:06 |
| [Diskussion und Fragen] Einführung in die Spieltheorie | Ben | Literatur | 0 | 06.06.2006 12:25 |
| Unterschiede JavaScript und AJAX | ibs | Sonstige Programmiersprachen | 13 | 13.04.2006 07:41 |
| AJAX Theme Engine für Wordpress | PaterNoster | Plauderecke | 0 | 17.11.2005 21:48 |
Alle Zeitangaben in WEZ +2. Es ist jetzt 19:59 Uhr.
Nach oben






