Wie auf der vorigen Seite erläutert benötigt man für die AJAX Kommunikation
ein XMLHttpRequest
Objekt.
Mit einem XMLHttpRequest Objekt kann man Dateien empfangen und senden. mehr dazu siehe w3schools Dieses Objekt hat folgende Methoden und Eigenschaften.
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. |
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.
|
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 | 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. |
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.
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" );
In folgenden 4 Beispielen werden die Daten aus einer XML Datei gelesen und damit eine Bilder-Galerie erstellt. Hier die img_info.xml
'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.
'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;
'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.
'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.
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.