Ajax in 10 Minuten verständlich erklärt auf einer DIN-A4-Seite
Asynchron, also unabhängig vom Laden der darunterliegenden Seite, ist es möglich, einen oder mehrere HTTP-Requests
zu senden und innerhalb einer Callbackfunktion
die HTTP-Response
ins DOM
zu rendern. JavaScript
benötigt dafür ein Objekt:
var xhr = (window.XMLHttpRequest) ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
Mit diesem Objekt bzw. mittels der diesem Objekt zur Verfügung stehenden Methoden wird der Request wie folgt vorbereitet:
xhr.open("GET", '/ajaxintro.html?x=y;foo=bar', true); ODER xhr.open("POST", '/ajaxintro.html', true);
Und schließlich wird der Request gefeuert:
xhr.send(null); // GET ODER xhr.send('x=y;foo=bar'); // POST
So ist der Ablauf stets in dieser Reihenfolge, was wir noch brauchen, ist die Anbindung einer Callback-Funktion
:
xhr.onreadystatechange = rx; function rx(){ if(xhr.readyState == 4 && xhr.status == 200){ callback_function(xhr.response); } else{ /*Fehlerbehandlung*/ } }
Die Callback-Funktion mit dem Namen callback_function()
bekommt die HTTP-Response direkt übergeben.
Moderne Browser verstehen anstatt xhr.responseText
ganz allgemein xhr.response
wobei hierfür der Typ für die zu erwartende Response festgelegt werden muss:
xhr.responseType = 'arraybuffer'; /* 'text' ist der Default 'json', 'xml' sind weitere Typen */
Anmerkung: Der Content-Type-Header einer Response ist für die Ajax-Callbackfunktion ohne Bedeutung, weil mit xhr.responseType
der Typ festgelegt wurde.
Üblich sind Sequenzen von Schlüssel-Werte-Paaren, wobei mehrere gleichnamige Schlüssel ein Array bilden:
/* Seperator entweder ; oder & */ foo=bar;num=1;num=2;num=3 $data = { foo => 'bar', num => [1,2,3] };
Wobei auf die Werte das Percent-Encoding anzuwenden ist value = encodeURIComponent('äöü;=');
Die so erzeugte Sequenz wird entweder an den URL
gehängt als QUERY_STRING
oder direkt als Message-Body in einem POST
-Request gesendet, siehe obenstehende Syntax bzw. Anordnung zur xhr.send()
-Methode.
Wie bereits dargelegt, bekommt die Callbackfunktion
eine Response direkt übergeben, die Sequenz kann sowohl einzelne Werte auflösen als auch komplexere Datenstrukturen. Üblich sind JSON
oder XML
-Sequenzen, zum Deserialisieren gibt es Libraries, z.B. JSON.parse();
Typische Ereignisse (Event) sind das Laden einer Seite oder das Klicken auf einen Button. Die Callbackfunktion
hingegen wird aufgerufen, wenn die Antwort vom Server eintrifft.
Das ist der Default: application/x-www-form-urlencoded
und dieser lässt sich über das XHR-Objekt natürlich auch anders festtlegen:
xhr.setRequestHeader("Content-Type", "application/json"); ODER xhr.setRequestHeader("Content-Type", "application/xml");
Der Content-Type ist erforderlich, damit der serverseitige Parser die gesendete Daten/Parameter korrekt wiederherstellen kann. Gut zu wissen: Das XHR-Objekt sorgt spontan dafür, dass im Fehlfall der o.g. Default-Content-Type gesendet wird.
Ebenso erwarten die meisten serverseitig eingesetzten Parser vorrangig den Content-Type: application/x-www-form-urlencoded
(GET, POST) und für Datei-Uploads den Content-Type: multipart/form-data
(nur POST). Der Request-Content-Type ist gleichbedeutend mit der im <form>-Attribute Enctype="..."
getroffenen Festlegung. Auch hier gilt für den Enctype der Default: application/x-www-form-urlencoded
.
I.d.R. wird dafür die Methode param('Parametername');
genutzt, sie liefert entweder eine Liste mit den gewünschten Werten oder einen Einzelwert. Speziell in meinem Framework liefert param()
einheitlich dieselben Ergebnisse auch bei application/json
oder application/xml
, wobei sich auch hier die Wichtigkeit äußert, beim Request den Content-Type anzugeben. Der in meinem Framework eingesetzte Parser lädt dann automatisch die zuständige Subklasse für den Deserializer.
Allgemein bekannt und beliebt ist jQuery
, das gibt kurze Wege auch bei Ajax. Je nach serverseitig verfügbaren Parsern sind auch JSON/XML-Sequenzen
im Request möglich. Relativ neu ist das JavaScript-Objekt FormData
, womit File-Upload möglich wird. Des Weiteren bringt jQuery eine Serialize-Funktion mit, was das Auslesen von Formularen sehr vereinfacht.
Datenschutzerklärung: Diese Seite dient rein privaten Zwecken. Auf den für diese Domäne installierten Seiten werden grundsätzlich keine personenbezogenen Daten erhoben. Das Loggen der Zugriffe mit Ihrer Remote Adresse erfolgt beim Provider soweit das technisch erforderlich ist. sos@rolfrost.de.