AJAX: Mühelos einsetzen (Asynchronous Javascript and XML)

AJAX - Asynchronous Javascript and XML

Eine kurze Erläuterung mit einem einfachen Beispiel, wie die AJAX-Technologie im HTML-Seiten eingesetzt werden kann.

Die Funktionsweise von AJAX

Bei AJAX handelt sich um ein Verfahren, bei dem aus einer HTML-Seite im Webbrowser Daten mit dem Web-Server ausgetauscht werden. Normalerweise wird bei einer Benutzeraktion immer eine Anfrage an den Server gerichtet und eine HTML-Seite als Antwort empfangen und dargestellt. Mit AJAX dagegen werden per JavaScript asynchrone Daten (z. B. XML) an den Server gesendet. Diese werden auf dem Server verarbeitet und in der Antwort werden nur die benötigten Daten gesendet. Diese Daten werden dann mit DHTML dargestellt.

Die Nachteile der AJAX Technologie

  • Die JavaScript Unterstützung im Webbrowser muss aktiviert sein.
  • Im Microsoft Internet Webbrowser muss das Ausführen aktiver Inhalte erlaubt sein.
  • Die verschiedenen Eigenarten der Webbrowser müssen berücksichtigt werden.
  • Die Funktionalität des Zurück-Buttons muss berücksichtigt oder ausgeschaltet werden.
  • Wenn der Benutzer eine Bookmark setzt, gelangt er auf die entsprechende Seite aber nicht in den gleichen Zustand.
  • Auch mit dieser Lösung muss die Zeit zwischen Anfrage und Antwort (Latenzzeit) berücksichtigt werden. Insbesondere, weil der Benutzer ohne zusätzliche Maßnahmen nicht erkennt, dass eine Anfrage im Hintergrund erfolgt.

Ein AJAX Beispiel mit XMLHttpRequest

Wenn Sie unten den Schalter Lade Inhalt betätigen, wird der Inhalt per AJAX ausgetauscht. Dieses Beispiel arbeitet mit dem XMLHttpRequest auf eine statische XML-Datei. Getestet wurde dieses mit Firefox v1.0.5 und Microsoft Internet Explorer v6.0 SP2.

Lade InhaltZurücksetzen

Leerer Inhalt…

Mit den folgenden Anweisungen wird ein XMLHttpRequest erzeugt. Für den IE muss ein ActiveX-Objekt des Microsoft XML-Parser instanziert werden.

var request;
if (window.XMLHttpRequest) {
    // Non-IE browsers: Mozilla, Opera, Safari and Konqueror
    request = new XMLHttpRequest();
} else if (window.ActiveXObject) {
    // IE browser
    try {
        // New style
        request = new ActiveXObject("Msxml2.XMLHTTP");
    } catch(e) {
        // Old style
        request = new ActiveXObject("Microsoft.XMLHTTP");
    }
}

Als nächstes wird die JavaScript Funktion processStateChange() gesetzt, welche als Event-Handler für AJAX fungiert. Die Funktion des Event-Handlers wird weiter unten beschrieben.

request.onreadystatechange = processStateChange;

Im nächsten Schritt wird die HTTP-Verbindung zum Server geöffnet. Dazu wird hier die Methode POST gewählt. Möglich sind aber auch noch GET, PUT oder HEAD. Der letzte Parameter bestimmt, ob die Datenübertragung synchron (false) oder asynchron (true) durchgeführt wird. Die URL kann übrigens aus Sicherheitsgründen nur auf die gleiche Domain der aktuellen HTML-Seite gehen. Zusätzlich kann auch ein Benutzername und ein Passwort angegeben werden: open(method, url, asynchronous-flag, username, password).

request.open("POST", url, true);

Sobald die Verbindung steht, können die Daten (xmldata) gesendet werden. In diesem Beispiel können optional Daten in Form einer XML versendet werden. Ist dieses der Fall, xmldata != null, müssen einige Parameter im Header des Request gesetzt werden. Danach kann der Request abgesendet werden. Die Methode send() wird direkt zurückkehren, da wir eine asynchrone Kommunikation gewählt haben. Im anderen Fall hätte diese Methode blockiert, bis die Kommunikation abgeschlossen ist.

if (xmldata) {
    request.setRequestHeader("Content-Type", "text/xml");
    request.setRequestHeader("Content-Length", xmldata.length);
}

request.send(xmldata);

Die weitere Verarbeitung der Antwort findet im Event-Handler statt. Insgesamt sind vier Verbindungszustände definiert, dabei bedeutet der Wert 4, dass die Antwort vom Server vollständig empfangen ist. Dieser Status dürfte der Wichtigste von allen sein (Quelle). Die Bearbeitung ist in eine Funktion responseComplete() ausgelagert worden.

function processStateChange() {
    switch (request.readyState) {
    case 0: // uninitialized
    case 1: // loading
    case 2: // loaded
    case 3: // interactive
        break;

    case 4: // complete
        responseComplete();
        break;

    default:
        errorHandler();
        break;
    }
}

Zuvor wurde in der aktuellen HTML-Seite ein Bereich für die Aufnahme der Antwort vorbereitet.

<div id="content">
    <p>Dieser Bereich ist leer.</p>
</div>

Als nächstes wird mit der DOM-Methode getElementById() dieses HTML-Element gesucht. Falls dieses Element nicht gefunden wird, wird in der Statuszeile des Browsers eine Fehlermeldung angezeigt. Als nächstes muss die Antwort geprüft werden. Im Falle des HTTP-Codes 200 ist alles in Ordnung, ansonsten wird der Text des DIV-Elements durch eine Fehlermeldung ersetzt (die Methode statusText() liefert die Meldung zum HTTP-Status). Die Antwort wird mit der Methode responseText() als eine Zeichenkette abgefragt. Mit der Methode responseXML() kann die Antwort auch als DOM-Dokument abgefragt werden, wenn der Server die Daten mit dem MIME-Type text/xml gesendet hat.

function responseComplete() {
    contentDiv = document.getElementById("content");

    if (contentDiv) {
        if (request.status == 200) {
            response = request.responseText;
            contentDiv.innerHTML = response;
        } else {
            contentDiv.innerHTML = "<p style='style'>Error: Status " + request.status + ", Message: " + request.statusText + "</p>";
        }
    } else {
        window.status = "No Content-DIV found";
    }
}

Zum Abschluss noch die Funktion errorHandler(). Diese wird allerdings nur aufgerufen, wenn ein nicht abgefangener Verbindungsstatus vorliegt.

function errorHandler() {
    contentDiv = document.getElementById("content");
    if (contentDiv) {
        contentDiv.innerHTML = "<p style='style'>" + "Error: Unknown Ready State</p>";
    } else {
        window.status = "No Content-DIV found and unknown Ready State";
    }
}

Hier ist noch ein kleines Beispiel, wie prinzipiell eine XML-Antwort verarbeitet werden kann.

var response = request.responseXML;
var body = response.getElementsByTagName("body");
...

Die Literaturempfehlungen

Frank Rahn
Letzte Artikel von Frank Rahn (Alle anzeigen)
0 Kommentare

Hinterlasse einen Kommentar

An der Diskussion beteiligen?
Hinterlasse uns deinen Kommentar!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Ihre E-Mail-Adresse wird nicht veröffentlicht. Ihr Kommentar wird verschlüsselt an meinen Server gesendet. Erforderliche Felder sind mit * markiert.

Weitere Informationen und Widerrufshinweise finden Sie in meiner Datenschutzerklärung.