info@a-coding-project.de

Andere Formen von Ajax

Je nach dem welches Ziel mit dem Einsatz von Ajax-Techniken verfolgt wird kann es sich unter Umständen heraus stellen, dass einzelne Bestandteile zu kompliziert sind bzw. das Ziel mit deutlich einfacheren Mitteln erreicht werden kann. Insbesondere das Auslesen und Verarbeiten der XML-Daten stellt oftmals einen nicht unerheblichen Aufwand im Vergleich zum relativ geringen Nutzen dar.

Ajax ohne XML: JSON

Eine Alternative zur Verwendung von XML-Daten stellt hier das sogenannte JSON dar. Gesprochen wird es wie der amerikanische Name Jason und ist im Prinzip nichts anderes als die einfache Objektschreibweise. In Verbindung mit Ajax geschieht hier folgendes:

Um das Auslesen und Verarbeiten der per Ajax abgerufenen Daten zu erleichtern wird vom Server keine XML-Datei sondern direkt JavaScript-Code ausgegeben. Damit dieser möglichst universell verarbeitet werden kann, erfolgt die Ausgabe der Daten hierbei in Form von einfachen Objekten. Man fragt den Code normal per Ajax ab und führt diesen anschließend mittels der eval-Funktion aus. Diese funktioniert im Prinzip wie das <script> in HTML: Der als String übergebene Wert wird als JavaScript-Code erkannt und ausgeführt. Das im Code enthaltene Objekt wird damit erstellt und kann anschließend verwendet werden.
Der vom Server gelieferte Code könnte z.B. so aussehen:

{Name:'Max Mustermann', 
 Straße: 'Musterstraße 14', 
 PLZ:'12345', 
 Ort:'Musterhausen'}

... der vom Client dann so verarbeitet wird:

o.open('GET','http://www.meineseite.de/seite.php');
o.onreadystatechange = function ()
{
 if(o.readyState == 4 && o.status != 200)
 {
  kunde = eval(o.responseText);
  document.writeln(kunde.Name+'<br>');
  document.writeln(kunde.Straße+'<br>');
  document.writeln(kunde.PLZ+' ');
  document.writeln(kunde.Ort+'<br>');
 }
};
o.send(null);

Mehr zum Thema JSON in JavaScript

Ajax ohne XMLHttpRequest

Neben dem Problem wie man die XML-Daten sinnvoll verarbeiten kann, taucht in manchen Fällen das Problem auf, dass das zur Übertragung verwendete XMLHttpRequest-Objekt nicht zur Verfügung steht - etwa weil der Browser dies nicht unterstützt. Auch hierfür gibt es in den meisten Fällen eine Lösung.

Daten per IFrame laden

Die einfachste und zugleich gebräuchlichste Lösung, Daten ohne die Verwendung des XMLHttpRequest-Objekts zu laden, ist die Verwendung von IFrames. Hierbei wir in die Seite hinein ein 1x1 Pixel großer <iframe ...> erzeugt, der anschließend angesprochen und in den eine Datei geladen werden kann. Werden neue Daten benötigt wird dem IFrame einfach eine neue URL zugewiesen und so der Inhalt des IFrames neu geladen. Statt XML-Daten wird in diesem Fall vom Server eine normale HTML-Datei erzeugt die selbst wiederum ein JavaScript mit entsprechenden Anweisungen beinhaltet. Um etwa wie in den vorangegangenen Beispielen jeweils eine Adresse vom Server abzufragen und anzuzeigen könnte z.B. folgender Code dienen:

document.writeln('<iframe src="about:blank" name="ajaxframe" '+
                 'height="1" width="1" ></iframe>');
parent.ajaxframe.location.href = 'adressen.php';

... adressen.php könnte dann in etwa so aussehen:

<html>
<head></head>
<body >
<script language="JavaScript">
<!--
 alert('Max Mustermannn'+
       'Musterstraße 14n'+
       '12345 Mustehausen')
//-->
</script>
</body>
</html>

Daten per Script laden

Ähnlich wie beim Laden eines IFrames kann auch ein einfaches Script-Element dazu verwendet werden, Daten dynamisch bei Bedarf nachzuladen. Hierzu erstellt man einfach ein neues script-Element und hängt es an den <head> an. Der Browser lädt das Script nach und führt es aus. Die so gewonnenen Daten können anschließend entsprechend verarbeitet und angezeigt werden. Einfaches Beispiel für die HTML-Datei:

var Head = document.getElementsByTagName("head")[0];
var Script = document.createElement('script');
Script.setAttribute('type', 'text/javascript');
Script.setAttribute('src', daten.php');
Head.appendChild(Script);

... in daten.php würde dann z.B. folgendes stehen:

var Name = 'Max Mustermann';
var Straße = 'Musterstraße 14';
var plzort = '12345 Mustehausen';
var fertiggeladen = true;

Der Knackpunkt an dieser Variante liegt darin, dass man nicht genau weiß ob/wann die Daten geladen sind. Insbesondere wenn sich das geladene Script nicht selbst ausführt sondern lediglich Variablen auf einen neuen Wert setzt muss irgendwie in Erfahrung gebracht werden wann und ob das Script geladen wurde. Hierzu bedient man sich mehreren Timeouts und prüft regelmäßig ob das Script angekommen ist:

var fertiggeladen = false;
var dl = 0;

function scriptGeladen(callback)
{
 if(!fertiggeladen)
 {
  dl++;
  if(dl>100){return false;}
  window.setTimeout('scriptGeladen("'+callback+'"',500);
  return false;
 }
 eval(callback);
}

function sagan()
{
 alert(Name+'n'+
       Straße+'n'+
       plzort);
}

var Head = document.getElementsByTagName("head")[0];
var Script = document.createElement('script');
Script.setAttribute('type', 'text/javascript');
Script.setAttribute('src', daten.php');
Head.appendChild(Script);
scriptGeladen('sagan()');

Daten senden per Image

Noch deutlich einfacher und zudem selbst mit älteren Browsern kompatibel geht es, wenn es einzig darum geht, Daten an den Server zu senden, ohne dass dazu das Ergebnis vom Browser interessant ist. Hierzu bedient man sich einfach einer Grafik die geladen und damit vom Server abgerufen wird. Statt einem Bild lädt man jedoch eine PHP-, ASP oder andere Datei und um die Daten an den Server zu übermitteln werden diese dabei einfach als Parameter mit übergeben. Das Script kann die Parameter dann auswerten und leitet einfach zu einer echten Grafik weiter. Das Script dazu könnte z.B. recht einfach so aussehen:

a = new Image();
a.src = 'speichere.php?id=123&wert=7252';

... bzw. sofern der Nutzer eine Rückmeldung über den Zustand bekommen soll, einfach so:

<img src="leer.gif" width="20" height="20" name="speichere">
...
<script language="JavaScript">
<!--
 document.speichere.src = 'speichere.php?id=123&wert=7252';
//-->
</script>

... auf dem Server macht speichere.php dann z.B. folgendes:

<?php

mysql_query('INSERT INTO daten (id,wert) 
             VALUES("'.addslashes($_GET['id']).'",
                    "'.addslashes($_GET['wert']).'")');
header('Location: gespeichert.jpg');
exit;

?>

Für alle nicht PHP-ler: Das Script schreibt die beiden per Parameter id und wert übergebenen Daten in die mySQL-Datenbank und leitet den Abruf dann an die Datei gespeichert.jpg weiter. Der Besucher sieht also lediglich das Resultat, nämlich die Datei gespeichert.jpg die vielleicht einfach nur ein "Ok" oder dergleichen anzeigt.

Weiterlesen: ⯈ Ajax-Frameworks

Über uns

Stefan Wienströer

Wir entwickeln Webanwendungen mit viel Leidenschaft. Unser Wissen geben wir dabei gerne weiter. Mehr über a coding project

Auch interessant