Beruflich Dokumente
Kultur Dokumente
Vorwort
Lieber Leser, liebe Leserin,
AJAX ist ja eigentlich nichts Neues. Es ist nur eine geschickte Kombination von Javascript und
serverseitiger Programmierung unter Verwendung des XMLHttpRequest-Objekts. Deswegen steht dieses
Kapitel auch ganz am Schluss des Buches: Hier wird alles kombiniert, was Sie bisher erlernt haben
Inhaltsverzeichnis
1 Vorwort
2 Was ist AJAX?
2.1 Die Technologien
2.2 Entwicklungsumgebung für AJAX
2.3 Libraries und Frameworks für AJAX
2.4 Links
3 AJAX-Applikationen kennen lernen
3.1 Übung
3.2 Links
4 Google Maps verwenden
4.1 Eine erste Landkarte
4.2 Landkarte steuern
4.3 Links
5 Erstes Programm
5.1 HTML
5.2 Javascript
5.3 PHP
5.4 Parameter übergeben
5.5 Übungsprojekt
5.6 Links
6 Fehlerbehandlung
6.1 Bitte Warten
6.2 Fehler in Log-Fenster schreiben
6.3 AJAX-Aufruf nicht möglich
6.4 HTTP-Status nicht OK
6.5 PHP: error im Text
6.6 Alle Fehler einbinden
Der Begriff wurde von Jesse James Garrett geprägt, siehe [1]
(http://www.adaptivepath.com/publications/essays/archives/000385.php) .
URL eintippen
Warten (Webformular wird geladen*)
Formular ausfüllen
Formular ausfüllen
Formular ausfüllen
Formular absenden
Warten (Antwort wird geladen*)
Nur bei den mit Sternchen markierten Stellen passieren Datenübertragungen zwischen Server und Client -
während die UserIn das Formular ausfüllt also gar nicht. Mit AJAX ändert sich das:
URL eintippen
Warten (Webformular wird geladen*)
Formular ausfüllen (Liste nachladen*)
Formular ausfüllen (Feld speichern*)
Formular ausfüllen (Bild austauschen*)
Formular absenden
Warten (Antwort wird geladen*)
Die Technologien
AJAX vereinigt alle Technologien die Sie in diesem Wikibook kennen gelernt haben:
Eigenbau
Sie schreiben selbst das Javascript. Dabei müssen Sie selbst die Browser-Unterschiede des
XMLHTTPRequest-Objekts behandeln - nicht zu empfehlen
Clientseitige Library
Sie verwenden eine Library die das XMLHTTPRequest-Objekt kapselt, so dass Sie
browserunabhängig arbeiten können. Sie schreiben Javascript und serverseitiges Programm separat.
Beispiel: prototype.js
Framework mit Mapping
Sie verwenden ein Framework, das Javascript mit Ihrer bevorzugten serverseitigen
Programmiersprache verbindet: Ein Javascript-Funktionsaufruf mit Javascript-Datentypen als
Argumente wird z.B. automatisch umgesetzt in ein PHP-Funktions-Aufruf mit PHP Datentypen als
Argumente. Beispiel: Mybic für PHP.
Framework das Javascript generiert.
Sie verwenden eine serverseitige Programmiersprache, die fertige AJAX-Komponenten anbietet, ohne
dass Sie dafür Javascript programmieren müssen. Beispiel: Ruby on Rails.
Links
Ajax
Artikel von Jesse James Garrett
(http://www.adaptivepath.com/publications/essays/archives/000385.php)
Übung
Öffnen Sie Firebug, und beobachten Sie bei der Benutzung der verschiedenen Applikationen wann eine
AJAX-Anfrage erfolgt.
Links
Ajax Examples (http://ajaxpatterns.org/Ajax_Examples) aus dem Wiki Ajax Design Patterns
Die Benutzung der Maps API ist derzeit kostenlos. Wenn man die Landkarte unter der Domain
http://www.beispiel.at online stellt muss man sich zuerst von Google einen dazu passenden Key geben
lassen - das ist einfach eine Zeichenkette, die dann in einer Variable im Programm gespeichert wird.
Zum Testen Ihrer Webseite brauchen Sie keinen Webserver. Sie können die Datei im Browser direkt
öffnen, so dass der Browser als Adresse eine URL anzeigt die mit file:/// beginnt. Das hat den Vorteil, dass
Sie dafür noch keinen API-Key brauchen. Wenn die URL mit http:// beginnt, z.B. http://localhost/,
brauchen Sie einen Key.
Die Dokumentation zu dieser API ist derzeit nur auf Englisch erhältlich.
<script src="http://maps.google.com/maps?file=api&v=2&key=ichbinkeinkey"
type="text/javascript"></script>
<script type="text/javascript">
//<![CDATA[
function karteladen() {
if (GBrowserIsCompatible()) {
var map = new GMap2(document.getElementById("karte"));
map.setCenter(new GLatLng(47.810001, 13.039999), 9);
}
}
//]]>
</script>
</head>
<body onload="karteladen()" onunload="GUnload()">
<div id="karte" style="width: 500px; height: 300px"></div>
In der ersten Zeile wird Javascript vom Google-Server geladen. Hier sehen Sie die Stelle an der Sie den Key
angeben können falls Sie die Seite dann auf einem Webserver veröffentlichen wollen.
Die selbstgeschriebene Funktion karteladen verwendet mehrere Befehle aus der Google Maps-API: Zuerst
wird getestet ob der Browser überhaupt Google Map - kompatibel ist. Dann wir eine neue Landkarte auf
basis der div karte erzeugt. Dann wird diese Landkarte auf einen bestimmte Punkt (in Längen- und
Breitengrad) zentriert. Die Zahl 9 gibt den Zoom-Level an, also wie gross der Kartenausschnitt ist.
Mögliche Werte sind 1 bis 14.
Die Karte sieht zwar statisch aus, bietet aber schon Interaktions-Möglichkeiten: die LeserIn kann mit der
Maus die Karte ziehen, und so einen anderen Kartenausschnitt wählen. Falls Sie ein Mausrad hat kann sie
damit zoomen.
Landkarte steuern
Bisher wirkte die Landkarte statisch. Damit die LeserIn weiss, dass Sie rein- und raus-zoomen kann bringen
wir nun Steuerelemente an:
map.addControl(new GSmallMapControl());
map.addControl(new GMapTypeControl());
Mit dem zweiten Steuerelement kann die LeserIn zwischen Satelliten-Karte und Strassen-Karte hin und her
schalten.
Links
Google Maps API Dokumentation (http://www.google.com/apis/maps/documentation/)
Erstes Programm
Das erstes Beispiel soll nur die Datenübertragung zwischen Client und Server illustrieren; tut also noch
nichts sinnvolles. Wenn der Button gedrückt wird, wird vom Webserver Datum und Uhrzeit abgefragt und
angezeigt.
HTML
Die Webseite enthält als HTML-Code einen Button zum Starten des AJAX-Aufrufs, und eine leere div um
das Ergebnis aufzunehmen.
Javascript
Als Javascript-Library wird Prototype verwendet, und im Head des Dokuments eingebunden:
Die Funktion hol_datum setzt den AJAX-Request ab. Dafür wird ein neues Ajax.Request Objekt erzeugt.
Dieses Objekt entstammt der prototype-Library. Beim Konstruktur werden zwei Argumente übergeben:
Eine Zeichenkette, diese enthält die URL des serverseitigen Programmes, in diesem Falle also
datum.php
Ein Objekt mit weiteren Optionen. In diesem Falle wird das Objekt in JSON-Schreibweise angegeben,
es hat zwei Eigenschaften:
method mit dem Wert get legt die HTTP-Übertragungsmethode fest (könnte auch post sein)
onComplete mit dem Wert zeige_datum legt die Funktion fest, die aufgerufen wird sobald die
Antwort vom Server auf die AJAX-Anfrage angekommen sind.
function hol_datum() {
var myAjax = new Ajax.Request(
"datum.php",
{ method: 'get', onComplete: zeige_datum }
);
}
Wichtig: Beim Angeben der onComplete-Funktion dürfen Sie keine Klammern schreiben! Das würde die
Funktion sofort ausführen, nicht erst wenn die Daten vom Server da sind.
Einige Milli-Sekunden später, wenn die Antwort vom Server vorliegt, wird die Funktion zeige_datum
aufgerufen. Die Funktion erhält als Parameter das XMLHTTPRequest Objekt das für die AJAX-Anfrage
erzeugt wurde, und kann aus der responseText Eigenschaft des Objekt die Antwort des Servers auslesen.
In diesem Beispiel wird die Antwort des Servers einfach in die div mit der id output kopiert.
Prototype bietet noch eine praktische Abkürzung für die oft verwendete Funktion
document.getElmenetByID, die Dollar-Funktion:
PHP
Das Serverseitige Programm können Sie in jeder beliebigen Sprache schreiben, sein Output muss nur ein
HTML-Fragment sein. Hier eine PHP-Version des Programmes:
<?php
echo "Jetzt ist es " . date("r");
?>
Parameter übergeben
Nun sollen beim AJAX-Aufruf Parameter an das Serverseitige Programm übergeben werden. Dazu bauen
wir zwei checkboxes ein, mit denen man Datum und Uhrzeit separat bestellen kann:
Als Parameternamen wurden hier d für Datum und u für Uhrzeit gewählt:
Beim erzeugen des Ajax.Request Objekts sollen diese Parameter mit übergeben werden, die entsprechende
Eigenschaft heißt parameters.
Es hat natürlich keinen Sinn die Parameter wie im Code gezeigt fix anzugeben. Statt dessen sollen die
aktuellen Werte der Checkboxen verwendet werden.
Auch dafür gibt es in Prototype eine praktische Hilfs-funktion. Dazu müssen die Eingabefelder aber in einen
<form> Tag eingeschlossen werden:
<form id="input">
<input type="checkbox" name="d">Datum<br />
<input type="checkbox" name="u">Uhrzeit<br />
...
Dann kann man die Parameter aus dem Formular mit Form.serialize auslesen:
Übungsprojekt
Erstellen Sie ein Javascript-Programm, dass bei Laden der Seite (einmal) aufgerufen wird, und
Browsernamen, Browserversion und Bildschirmgrösse per AJAX an den Server meldet. Dort sollen die
Daten in einer Log-Datei gespeichert werden. So können Sie eine Statistik über die Browser Ihrer
LeserInnen führen.
Links
Another Prototype Reference
(http://blogs.ebusiness-apps.com/jordan/pages/Prototype%20Library%20Info.htm) (Englisch)
Quick Guide to Prototype (http://particletree.com/features/quick-guide-to-prototype/) (Englisch)
Fehlerbehandlung
Bisher haben wir angenommen, dass alles funktioniert: der Server ist erreichbar, das serverseitige Programm
läuft, die Daten werden korrekt übertragen. Nun werden wir mögliche Fehler behandeln, und der UserIn
mehr Feedback über den Status des Programmes geben.
Bitte Warten
Wenn das Laden vom Server einmal etwas länger dauert soll die LeserIn trotzdem wissen, dass etwas
passiert. Die Statusanzeige des Browser hilft nicht, da diese für Anfragen mit dem
XMLHTTPRequest-Objekt nicht aktiviert wird. Wir müssen also so eine Status-Anzeige selbst bauen.
Die Statusanzeige selbst besteht aus einem animierten gif, diese Bild ist immer in der Webseite vorhanden,
aber mit der Style-Anweisung display:none unsichtbar geschalten:
Wieder bietet Prototype eine praktische Methode, mit der man Elemente der Webseite sichtbar und
unsichtbar schalten kann: Element.show und Element.hide. Diese Befehle werden entsprechend in den
Javascript-Code eingefügt:
function hol_datum() {
$('output').innerHTML = "Wird geladen";
Element.show( $('bittewarten') );
var myAjax = new Ajax.Request(
"datum_uhrzeit.php",
{
method: 'get',
parameters: Form.serialize($('input')),
onComplete: show_datum
}
);
}
function log_error ( t ) {
$('log').innerHTML += t + "<br />";
}
Dieser Fehler tritt u.A. dann auf, wenn man eine Anfrage an einen 'fremden' Server stellen will, dann erhält
man die Fehlermeldung:
HTTP-Status nicht OK
Die zweite Art von Fehler wird über den HTTP-Status-Code übermittelt: wenn der Code anders als 200
lautet ist das eine Fehlermeldung. Diese Fehler kann man mit onFailure abfangen:
Beim Programmieren einer 'echten' AJAX-Applikation ist die Ausgabe des Fehlers in eine log nicht genug,
hier ist eine gut lesbare Fehlermeldung an die UserIn zu formulieren.
Scriptaculous
Für alle Komponente ausser der Ersten brauchen wir Scriptaculous, eine weitere Javscript-Library die auf
Prototype aufbaut.
Scriptaculous besteht aus sieben Javascript-Dateien, die alle im selben Ordner zur Verfügung stehen
müssen. Geladen wird nur die Prototype-Datei und die Hauptdatei von Scriptaculous:
Das erste Argument enthält die ID einer div in der die Ergebnisse angezeigt werden sollen - hier output.
Das zweite Argument ist das Programm am Server das aufgerufen wird. Und das dritte Argument kann
wieder weitere Optionen enthalten, hier nur die Methode get.
Falls es auf Ihrem Server noch keinen interessanten Status abzufragen gibt, dann können Sie mit folgendem
Script 5 zufällig ausgewählte Umgebungs-Variablen anzeigen lassen:
<?php
$keys = array_keys( $_ENV );
shuffle($keys);
echo("<ul>");
$i = 0;
while($i < 5) {
$k = $keys[$i];
echo("<li><b>$k</b>: $_ENV[$k]");
$i++;
}
echo("</ul>");
?>
frequency - Wie oft soll der Update erfolgen, in Sekunden, Standardwert ist 2
decay - Faktor für die Verlangsamung der nächsten Anfrage, falls sich der Output des
Serverprogrammes nicht verändert hat
Editierbarer Text
Durch einen Klick wird aus einer normalen Zeile Text ein Eingabefeld. Die Eingabe wird über einen
AJAX-Anfrage gespeichert, dann verwandelt sich das Feld wieder in Text:
Der Text der editierbar sein soll wir mit einer id gekennzeichnet, ein Ajax.InPlaceEditor Objekt wird
erstellt, das diese id mit einem serverseitigen Skript verbindet.
Achtung: new Ajax.InPlaceEditor muss im Code nach dem entsprechenden Element kommen, Sie können
diesen Befehl also nicht in den Head kopieren.
Das Serverseitige Skript erhält seinen Input als Parameter value. Es kann den Text speichern, und eventuell
noch verändern. Der Output des serverseitigen Skripts wird im Endeffekt als Text auf der Webseite
angezeigt. Die einfachste Version (ohne speichern) wäre also:
<?php
echo $_REQUEST['value'];
?>
Das Textfeld für die Auto-Vervollständigung muss einen namen und eine id haben. Ausserdem muss eine
leere div vorhanden sein, in der die List der Vervollständigungs-Vorschläge später angezeigt wird. Diese div
hat die Klasse auto, eine eindeutige id, und eine Style-Anweisung um sie unsichtbar zu machen:
Aus diesen Elementen kann nun mit einem Befehl ein Textfeld mit Auto-Vervollständigung gemacht
werden:
<script>
new Ajax.Autocompleter('nachname', 'auto1', 'emailnachschlagen.php', {});
</script>
Achtung: new Ajax.Autocompleter muss im Code nach dem Eingabefeld und der div kommen, Sie können
diesen Befehl also nicht in den Head kopieren.
Der Server sollte als Antwort wirklich eine Liste im HTML-Sinne liefern, z.B.:
<ul>
<li>Querhuber</li>
<li>Quermaier</li>
<li>Quermüller</li>
<li>Quermüller-Querhuber</li>
</ul>
<style>
input#nachname {
width: 150px;
background: #fff;
}
div.auto{
width: 150px;
background: #fff;
}
div.auto ul {
border:1px solid #888;
margin:0;
padding:0;
width:100%;
list-style-type:none;
}
div.auto ul li {
margin:0;
padding:3px;
font-family: Verdana,Helvetica,sans-serif;
font-size: smaller;
}
div.auto ul li.selected {
background-color: #ffb;
}
div.auto ul strong.highlight {
color: #800;
margin:0;
padding:0;
}
</style>
<style>
ul.sortabledemo { list-style-type: none; width: 400px;}
ul.sortabledemo li { border: 1px #ddd solid; }
ul.sortabledemo li:hover { background-color: yellow; }
</style>
Die Liste (genauer gesagt: der ul-Tag) gehört zur Klasse sortabledemo, damit wird das Stylesheet wirksam.
Aussderm hat die Liste die id liedliste. Mit Sortable.create wird die Liste sortierbar:
<script type="text/javascript">
Sortable.create("liedliste", {});
</script>
Achtung: Sortable.create muss im Code nach der Liste kommen, Sie können diesen Befehl also nicht in
den Head kopieren.
Übungsprojekt
Mit den hier gezeigten Komponenten können Sie viele lustige Applikationen für die Kommunikation
zwischen mehreren Leuten programmieren.
Links
prototype (http://prototype.conio.net/)
script.aculo.us (http://script.aculo.us/)
Referenz
Liste der verwendeten Prototype und scriptaculous Objekte, Eigenschaften, Methoden:
Prototype
$(id)
Abkürzung für document.getElementByID(id)[4] (http://www.devshare.de/_ajax/prototype.js.html)
new Ajax.Request(url, options-objekt)
Startet eine AJAX-Abfrage, gibt ein Objekt zurück. [5]
(http://www.devshare.de/_ajax/prototype.js.html)
Argumente:
URL
Objekt mit folgenden Eigenschaften
method = Zugriffsmethode, entweder 'get' oder 'post'
onComplete = Funktion die aufgerufen wird wenn eine Antwort vom Server vorliegt. Sie
erhält als einziges Argument das XMLHTTPRequest-Objekt der AJAX-Abfrage.
parameters = Parameter für die HTTP-Abfrage, im URL-encoded Format
Ajax.PeriodicalUpdater
Element.show(element)
Element.hide(element)
Zeigt ein beliebiges Element der Seite an bzw. versteckt es. Dabei wird die Style-Anweisung
display:none eingefügt bzw. gelöscht.[6] (http://www.devshare.de/_ajax/prototype.js.html)
Form.serialize(form)
gibt eine URL-encoded Parameter-Zeichenkette die dem aktuellen Zustand des Formulars
entspricht.[7] (http://www.devshare.de/_ajax/prototype.js.html)
Scriptaculous
Weitere Quellen
Ajax (Asynchrones JavaScript + XML) ist ein Audruck, der von Jesse James Garret von Adaptive Path
(http://www.adaptivepath.com) in seinem Einführungsartikel
(http://www.adaptivepath.com/publications/essays/archives/000385.php) zu dem Thema ins Leben gerufen
wurde. Lesen Sie den Wikipedia-Artikel zu Ajax für eine genaue Definition.
Sinn und Zweck dieses Leitfadens ist, Ihnen zu zeigen, wie Sie Ajax unaufdringlich
Es gibt bereits einige Websites, die es sich zur Aufgabe gemacht haben, für (aber auch gegen) die
Benutzung von Ajax zu werben. Deswegen wird hier versucht, eine möglichst unvoreingenommene Liste
dieser Seiten zu erstellen. Obwohl ich jeden herzlich einlade, die Liste zu erweitern, ist es aus Gründen des
Urheberrechts unmöglich, von jedem die Einverständnis zu erhalten, seine Inhalte hier einzubinden.
Außerdem sind stellen diese Seiten oft genau das Konzept zur Schau, dass sie zu beschreiben versuchen.
Sofern ein Konzept mit Ajax zusammenhängt, sollte es hier beschrieben werden, aber die endgültige Arbeit
sollte in andere Wikibooks oder Websites ausgelagert werden, wo es bereits herausgearbeitet wurde oder
werden soll.
Angesichts dieser Tatsachen gibt es einige Konzepte, mit denen Sie sich vertraut machen sollten, wenn Sie
mit Ajax arbeiten wollen. Es sind aber nicht alle unbedingt nötig, um sich seinen eigenen Code
zusammenzukopieren, die folgenden werden empfohlen.
JavaScript
Wikibook
Wikipedia
XHTML
Wikipedia
XML
Wikipedia
Wikibook
Document Object Model
Wikipedia
Cascading Style Sheets
Wikipedia
Wikibook
XSLT
Wikipedia
Wikibook
Weiterlesen
Mozilla developer wiki: Ajax (http://developer.mozilla.org/en/docs/AJAX)
Wiki:JavaScriptAbuse (http://c2.com/cgi/wiki?JavaScriptAbuse)
the Ajax Patterns wiki (http://ajaxpatterns.org/)
</noinclude>
Von „http://de.wikibooks.org/wiki/Websiteentwicklung:_AJAX/_Druckversion“
Diese Seite wurde zuletzt am 25. Oktober 2006 um 00:22 Uhr geändert.
Inhalt ist verfügbar unter der GNU Free Documentation License.