AJAX

Begriff Ajax wurde 2005 von Jesse James Garrett geprägt.

Ajax steht als Abkürzung für Asynchronous JavaScript and XML (asynchrones JavaScript und XML) doch Ajax-Anwendungen nicht asynchron im Sinne, dass Kommunikation mit Server völlig losgelöst von Benutzereingaben stattfindet. Auch ist XML nicht zwangsläufig das Übertragungsformat für Daten zwischen Client und Server.

„Ajax“ => JavaScript-gestützter Datenaustausch mit Webserver im Hintergrund.

  • XML => ein mögliches, aber nicht zentrales Übertragungsformat

  • asynchron => JavaScript-Ausführung blockiert beim Warten auf Server-Antwort nicht Browser, JavaScript-Ereignisse werden gefeuert, wenn Server-Antwort eingetroffen

  • funktioniert also über selbsterzeugte HTTP-Anfragen, Server-Antwort steht Script zur Verfügung

  • neu = asynchrone Kommunikation im Hintergrund

Interaktion im Web ohne Ajax

  • Anwender aktiviert Link oder sendet Formular ab

  • Browser sendet entsprechende HTTP-Anfrage an Webserver

  • Webserver antwortet, indem er üblicherweise HTML-Dokument zurückliefert, das Browser verarbeitet und anstelle des alten anzeigt

  • ohne Ajax muss immer neues, vollständiges HTML-Dokument vom Server geladen werden

  • Ajax durchbricht Prinzip und ändert damit Bedienung von Webseiten und Aufbau von Webanwendungen grundlegend

  • werden nur kleine Datenportionen mit Webserver ausgetauscht - gerade benötigte Daten werden nachgeladen, dem Server ausgewählte Änderungen mitgeteilt

  • im Extremfall kommt Single Page Application heraus

  • besteht nur aus einem ursprünglichen HTML-Dokument

  • restlicher Datenaustausch mit Webserver läuft per JavaScript im Hintergrund: über DOM-Schnittstelle wird Dokument nach Belieben umgestaltet

  • Dokument reagiert auf Benutzereingaben, übersendet diese gegebenenfalls an Server, lädt im Hintergrund Inhalte vom Server nach und montiert sie ins bestehende Dokument

Vor- und Nachteile von Ajax

Klassisches Modell mit eigenständigen, adressierbaren Dokumenten

Herkömmliches Modell funktioniert nach Grundsatz »Stop and Go«:

  1. Anwender klickt auf Link oder Absende-Button eines Formulars und muss warten

  2. Browser übermittelt Anfrage an den Webserver

  3. Webserver speichert gegebenenfalls Änderungen ab und generiert neues, vollständiges Dokument

  4. Wenn Dokument zum Client-Rechner übertragen wurde und Browser es vollständig dargestellt hat, kann Anwender in Webanwendung weiterarbeiten

  5. Browser zeigt Reihe von eigenständigen HTML-Dokumenten (Ressourcen) an, die alle eindeutige, gleichbleibende Adresse (URL) besitzen

Dokumente sind unabhängig von JavaScript lesbar, verlinkbar, durch Suchmaschinen indizierbar, problemlos abspeicherbar.

Besonderheiten bei Ajax

  • Mit Ajax Server-Anfragen im Hintergrund, ohne dass Dokument ausgewechselt wird

  • Warten auf Server-Antwort fällt ganz weg oder wird extrem verkürzt

  • gibt keine vollständigen, adressierbaren Dokumente mehr, die in Webanwendungen bestimmten Punkt und Status markieren

  • Zurück-Funktion des Browsers funktioniert bei Verwendung von Ajax nicht mehr wie gewohnt

Zugänglichkeit von Ajax-Anwendungen

  • Großer Teil der Datenverarbeitung vom Server-Rechner auf Client-Rechner (Browser) verlagert

  • Verlauf, den bisher Browser automatisch zur Verfügung stellte, müssen in Ajax-Anwendungen nachgebaut werden, z.B. indem jeder Status eine Adresse bekommt, damit Zurück-Navigation funktioniert

Einsatzgebiete

  • Einsatz von Ajax als Zusatzfunktionalität

  • Wenn JavaScript verfügbar, genießt Anwender gewissen Extra-Komfort in Bedienung

  • Wenn JavaScript nicht aktiv oder Ajax nicht verfügbar, kann Website trotzdem ohne funktionale Einschränkungen benutzt werden

  • Nachladen von Inhalten auf Benutzerwunsch (z.B. beim Klicken oder Überfahren mit Maus)

  • Automatische Vervollständigung (Autocomplete und Suche bei der Eingabe)

Server-Aktionen ohne Antwort-Daten

Einfache Formulare, die per Ajax automatisch abgesendet werden:

  • Kommentarfunktion

  • Bewertungen mit einfacher Skala (z.B. 1-5 Sterne)

  • Abstimmungen

  • Listen-Funktionen wie Markieren, Ausblenden, Löschen usw.

  • Blättern und Seitennavigation

  • Wechsel zwischen Lese- und Editier-Modus bei Formularen

  • Regelmäßige Aktualisierungen vom Server (Liveticker, E-Mail, Chats)

  • verwendete Dateiformate für Übertragung: HTML, XML und JSON

XML

Das XML Format wird in JavaScript hauptsächlich für Ajax angewandt.

XML-Dokument hat strikte Regeln für Aufbau, dadurch sehr einfach, DOM (Document Object Model) zu nutzen. Auch hier in Knoten denken und in Hierarchie navigieren.

let xmlString = '<?xml version="1.0" encoding="UTF-8"?>' +
    '<artists>' +
    '<artist name="Kyuss">' +
    '<albums>' +
    ' <album>' +
    ' <title>Wretch</title>' +
    ' <year>1991</year>' +
    ' </album>' +
    ' <album>' +
    '   <title>Blues for the Red Sun</title>' +
    '    <year>1992</year>' +
    '   </album>' +
    '   <album>' +
    '    <title>Welcome to Sky Valley</title>' +
    '    <year>1994</year>' +
    '  </album>' +
    '  <album>' +
    '   <title>...And the Circus Leaves Town</title>' +
    '  <year>1995</year>' +
    '  </album>' +
    '  </albums>' +
    '</artist>' +
    '</artists>';

console.log(xmlString);

Der XML-String wird als XMLDocument Datentyp implizit umgewandelt, welcher die gleichen Methoden wie Document bietet. Der Aufbau von XML ist sehr ähnlich dem von HTML und die DOM-API für HTML lässt sich ebenfalls auf XML anwenden.

Umwandlung XML-String zu XML-DOM (XML-Dokument)

Über das DOMParser Objekt lässt sich mit der .parseFromString() Methode ein XML-String in ein XML-DOM Objekt umwandeln.

let parserObj = new DOMParser();
let xmlDoc = parserObj.parseFromString(xmlString, "text/xml");
console.log(xmlDoc);

Hierauf lassen sich sämtliche DOM-Methoden des Documents (HTML-DOM) ebenfalls nutzen:

// Methoden vom DOM-Zugriff integriert/nutzbar
let myArtist = xmlDoc.querySelector("artist");
console.log(myArtist);

Important

Es ist kein Zugriff per IDL möglich, da sich das XML-Document nicht im (herkömmlichen) DOM befindet:

// kein IDL-Zugriff, da document nicht im DOM
console.log(myArtist.name);                 // undefined
console.log(myArtist.getAttribute("name")); // Kyuss

Umwandlung XML-Dokument in XML-String

Über das XMLSerializer Objekt lässt sich über die .serializeToString() Methode ein XML-Dokument in einen XML-String umwandeln.

let serializerObj = new XMLSerializer();
let myXMLStr = serializerObj.serializeToString(xmlDoc);
console.log(myXMLStr);

XMLHttpRequest

Über einen XMLHttpRequest wird verwendet, um Anfragen vom Client an den Server zu schicken, bei welchem Daten angefordert werden. Diese Daten können im XML Format zurückgegeben werden, müssen jedoch nicht.

Anfrage senden

Zum Senden einer Anfrage wird zunächst das XMLHttpRequest-Object (XHR) erstellt:

// 1. XHR-Object erstellen
let xhr = new XMLHttpRequest();

Daraufhin wird ein Event-Handler erzeugt, welcher auf die Server-Antwort wartet:

// 2. Event-Handler erstellen
xhr.onload = function() {
    // feuert, wenn Server-Antwort vollständig eingetroffen
    // response muss nicht zwingend angefragte Daten enthalten
    if (xhr.status != 200) return;
    // Server hat mit "OK" (Status 200) geantwortet
    // https://developer.mozilla.org/en-US/docs/Web/HTTP/Status
    // https://en.wikipedia.org/wiki/List_of_HTTP_status_codes
    // Daten wurden ordnungsgemäß übermittelt und können jetzt verarbeitet werden
    console.log(xhr);
};

Hint

Hier wird der onload Event Handler einer Funktion zugewiesen, welche den Status 200 (OK) setzt und das XMLHttpRequest Objekt in die Konsole geloggt. Die Funktion wird folglich nach Abschließen der Anfrage d.h. dem Erhalt der Server-Antwort ausgelöst.

Als nächstes muss über .open() die HTTP-Anfrage formuliert werden.

// 3. HTTP-Anfrage formulieren
xhr.open("GET", "./artists.xml");
// xhr.open("POST", "./script.php");

Hint

Hier wird ein XML-Dokument über die GET-Methode angefordert.

Die Anfrage lässt sich weiterhin konfigurieren. Hier wird über .responseType der Rückgabetyp der Daten definiert, in diesem Fall "document", was entweder einem HTML oder einem XML-Dokument entspricht.

Über .setRequestHeader() lässt sich ein Text an das Ende einer Headers anhängen. In diesem Fall wird an den "Accept" Feld der Wert "text/xml" angehängt, was dem Server mitteilt, dass der Client Antworten des Mimetypes text/xml, also einen XML String, akzeptiert. Wird er nicht definiert, werden die Antwortdaten als String gespeichert.

// 4. Anfrage konfigurieren
// Wie sollen Antwort-Daten vorliegen?
// xhr.responseType = "";  // Antwort als String (default)
xhr.responseType = "document";  // geparstes Document (HTML || XML)
// xhr.responseType = "json";      // geparste JSON-Daten, wenn Browser es kann

// Request-Header konfigurieren
xhr.setRequestHeader("Accept", "text/xml");

Die Anfrage wird zuletzt mit .send() ausgeführt.

// 5. Anfrage senden
xhr.send();
// xhr.send(data);

console.log (xhr);  // Daten vom Server noch nicht da

Zusätzlich lassen sich weitere Event-Listener dem XMLHTTPRequest anhängen, z.B. um wie hier, den aktuellen Status des Requests anzuzeigen:

 xhr.addEventListener("load", function() {
    console.log("Laden der Daten vom Server abgeschlossen!");
});

xhr.addEventListener("progress", function() {
    console.log("Fortschritt beim Laden der Daten vom Server!");
});

xhr.addEventListener("error", function() {
    console.log("Fehler beim Laden der Daten vom Server!");
});

xhr.addEventListener("timeout", function() {
    console.log("Timeout beim Laden der Daten vom Server!");
});

Antwort weiterverarbeiten

Hat man über einen XMLHTTPRequest ein Antwort-Objekt mit vom Server erhalten, lässt sich der HTML oder XML Inhalt über das .responseXML Attribut auslesen.

const output = document.querySelector("#browser");

const xhr = new XMLHttpRequest();
xhr.onload = function() {
    if (xhr.status != 200) {
        output.textContent = "Ooops";
        return;
    }

    const xml = xhr.responseXML;
    const allBrowser = xml.querySelectorAll("browser");
    console.log(allBrowser);

    outputFunc(allBrowser);
};

Beachte, dass der Rückgabewert von .responseXML vom Typ Document ist. Damit lässt sich weiterarbeiten, wie mit dem DOM.