AJAX

Wie auf der vorigen Seite erläutert benötigt man für die AJAX Kommunikation ein XMLHttpRequest Objekt.

XMLHttpRequest Object

Mit einem XMLHttpRequest Objekt kann man Dateien empfangen und senden. mehr dazu siehe w3schools Dieses Objekt hat folgende Methoden und Eigenschaften.

Methoden von XMLHttpRequest
Methode Info
abort() Anfrage abbrechen
getAllResponseHeaders() Gibt alle Header der HTTP-Anwort als Zeichenkette zurück
getResponseHeader() Gibt für den Namen des Headers den entsprechenden Wert zurück.
open(method,url,async,user,passw) Startet die Anfrage.
Die Methode ist get oder post,
die URL, diegeladen werden soll
synchron(false), asynchron(true)
bei gesicherten Dateien, Usernamen
und Passwort
overrideMimeType(mime) Überschreibt den Mimetype, welcher vom Server geliefert wird.
send() Anfrage senden.
send(data) Anfrage senden und Daten übergeben, z.B. Formulardaten.
setRequestHeader(header,value) Setzt den Wert für den angegebenen Header.

 

Eigenschaften von XMLHttpRequest
Eigenschaft Info
readyState Zustand der Anfrage als Zahlenwert codiert
response Körper der Antwort von einem der Typen:
Array, Buffer, Blob, Document, JSON-Objekt, Zeichenkette, null, für den Fall, dass die noch nicht abgeschlossen ist oder nicht erfolgreich war.
responseText Die Antwort als Zeichenkette. Bei Misserfolg den Wert null.
responseType Hiermit wird bestimmt, welchen Datentyp die Antwort bekommen soll.
  • leere Zeichenkette (string)
  • arraybuffer (ArrayBuffer)
  • blob (Blob)
  • document (Document)
  • json (Javascript Objekt geparst aus Antwort)
  • text (String)
responseXML Die Antwort als Objekt vom Typ Document
status Statuscode der Anfrage z.B. 200
statusText Statusmeldung z.B. 200 OK
timeout Man definiert ein Zeitlimit in Millisekunden, um die Antwort mit timeout abzubrechen.
upload Event-Handler, über den der Status beim Hochladen verfolgt werden kann.
withCredentials Hiermit bestimmt man ob die Anfrage mit Credentials (z.B. Cookies, Authorisierungsheader) durchgeführt wird.
Events von XMLHttpRequest
Events Info
onabort Wird aufgerufen, wenn die Anfrage über die Methode abort() abegebrochen wird.
onerror Aufruf bei Fehler.
onload Aufruf, wenn alles erfolgreich geladen ist und zur Verfügung steht.
onloadend Aufruf nachdem die Anfrage erfolgreich ausgeführt wurde
onloadstart Aufruf nach Start der Anfrage
onprogress Aufruf bei Fortschritten der Anfrage
onreadystatechange Aufruf, wenn der Zustand der Anfrage sich ändert.
ontimeout Aufruf, wenn Anfrage aufgrund von timeout abgebrochen wird.

Die hier aufgeführten Events lassen sich auch mit Event-Listenern verwenden.Das Eventereignis wird ohne das vorangestellte on notiert. request.addEventListener("load", myfunction);

Senden und empfangen

Wenn man die Methode POST statt GET verwendet und einen Header anhängt, ist möglich etwas zu senden, bevor es empfangen wird. Das kann von PHP genau wie eine Formularvariable empfangen werden.

    xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xhttp.send("index=2");
Der Parameter in send() hat folgende Regeln: keine Leerzeichen, weitere Variablen werden mit kaufmännischem & angehängt. xhttp.send("name=Bernd&ort=Berlin")

Das Konfigurieren des Headers muss nach der Methode open() und vor der Methode send() geschehen.

So wäre es beispielsweise möglich einen Indexwert zu senden und dann aus einem Array ein bestimmtes Element zu empfangen. Im folgendem gibt es eine array.php und eine karte.html mit dem Javascript.

Beispiel

array.php

<?php
$nr = $_POST["index"];
$karte = [];
$karte[0] = "Narr";
$karte[1] = "Der Magier";
$karte[2]="Die Hohepriesterin";

echo json_encode($karte[$nr]);
?>

in Javascript:

let anzeige = document.getElementById( "anzeige" );
var xhttp = new XMLHttpRequest();
xhttp.onload = ( e ) =>
{
    var karte = JSON.parse( xhttp.responseText );
    anzeige.innerHTML = karte;
}
xhttp.open( "POST", "array.php", true );
xhttp.setRequestHeader( "Content-type", "application/x-www-form-urlencoded" );
xhttp.send( "index=2" );
            

XML Dateien empfangen

In folgenden 4 Beispielen werden die Daten aus einer XML Datei gelesen und damit eine Bilder-Galerie erstellt. Hier die img_info.xml

Beispiel 1

 'use strict';
    let request = new XMLHttpRequest();

    request.onload = function(e){
    if(request.status === 200){
    let xml = request.responseXML;
    }
    };
    request.open('GET', 'img_info.xml');
    request.responseType = 'document';
    request.setRequestHeader('Accept', 'text/xml');
    request.send(null);

request.status == 200 bedeutet, dass die Anfrage erfolgreich war.

request.responseType = 'document'; bedeutet, dass es sich um eine XML Datei handelt

setRequestHeader('Accept', 'text/xml') hier wird der XML Mime Type gesetzt.

Beispiel 2

 'use strict';
    let request = new XMLHttpRequest();

    request.onload = function(e){
    if(request.status === 200){
    let xml = request.responseXML;
    document.getElementById("anzeige").innerHTML = xml.getElementsByTagName("titel")[0].textContent;

    }
    };
    request.open('GET', 'img_info.xml');
    request.responseType = 'document';
    request.setRequestHeader('Accept', 'text/xml');
    request.send(null);

request.responseXML liefert das XML Document

Aus diesem XML Document kann man genauso wie beim HTML Document die einzelnen Elemente auf verschiedene Arten ansprechen.

xml.getElementsByTagName("titel")[0].textContent;

Beispiel 3

'use strict';
let request = new XMLHttpRequest();

request.onload = function(e){
if(request.status === 200){
let xml = request.responseXML;
let bilder =new Array(xml.getElementsByTagName("Bild").length) ;
let titel = xml.querySelectorAll("Bild > titel");
let url = xml.querySelectorAll("Bild > bildurl");
let flickr = xml.querySelectorAll("Bild > filmurl");

console.log(bilder.length);
for(let i = 0; i < bilder.length; i++){ bilder[i]={titel: titel[i].textContent, url:url[i].textContent,
    flickr: flickr[i].textContent }; console.log(bilder[i].titel); console.log(bilder[i].url);
    console.log(bilder[i].flickr); document.getElementById("anzeige").innerHTML +=bilder[i].titel+" | "+bilder[i].url+"<br>";
    } 
 }
};
request.open('GET', 'img_info.xml');
request.responseType = 'document';
request.setRequestHeader('Accept', 'text/xml');
request.send(null); 

Hier werden aus den XML Elementen Arrays erzeugt. Diese Arrays werden in der for-Schleife zu einem Array zusammengesetzt, dessen Elemente Objekte sind.

bilder[i] = {titel: titel[i].textContent, url:url[i].textContent, flickr: flickr[i].textContent };

So hat man einen übersichtlichen Zugriff auf alle Elemente.

beispiel 4

 'use strict';
let request = new XMLHttpRequest();

request.onload = function(e){
if(request.status === 200){
let xml = request.responseXML;
let bilder =new Array(xml.getElementsByTagName("Bild").length) ;
let titel = xml.querySelectorAll("Bild > titel");
let url = xml.querySelectorAll("Bild > bildurl");
let flickr = xml.querySelectorAll("Bild > filmurl");

console.log(bilder.length);
for(let i = 0; i < bilder.length; i++){ bilder[i]={titel: titel[i].textContent,
    url:url[i].textContent, flickr: flickr[i].textContent }; setElement(bilder[i].url,
    bilder[i].titel, bilder[i].flickr); } } }; request.open('GET', 'img_info.xml' );
    request.responseType='document' ; request.setRequestHeader('Accept', 'text/xml' );
    request.send(null); function setElement(imgSrc, imgTitel, imgLink){ let
    a=document.createElement('a'); a.setAttribute("href", imgLink); let
    img=document.createElement('img'); img.src=imgSrc; img.setAttribute("title", imgTitel);
    a.appendChild(img); document.body.appendChild(a); }

Hier ist eine Funktion hinzugekommen, die aus den Daten der XML Datei Links mit Bildern erzeugt, welche im body eingefügt werden.

Beispiel 5

In dieser Datei passiert in Sachen XML nichts neues. Lediglich die HTML Elemente und CSS Styles werden etwas optimiert, indem die setElement() etwas angepasst wird und im body ein vorhandes Div Element mit Flexbox Eigenschaften genutzt wird.


Javascript Tipps