tutorials.de Buch-Aktion 05/2012
  • Ajax mit jQuery, Json und PHP

    —In letzter Zeit dringt Ajax immer weiter vor und die Fragen häufen sich im Forum nach ala "wie mach ich das". Deshalb möchte ich euch den Grundlegenden Ablauf einer Ajax-Anwendung hier verdeutlichen.

    Dazu benutze ich Client seitig HTML5 und jQuery.
    Server seitig setze ich auf PHP, hier ist es aber eigentlich egal was ihr nehmt. Ich habe schon ganze Systeme von PHP auf Python umgeschrieben und die Templates nur minimal verändert.
    Grund dafür war unter anderem der Einsatz von Json zur Übertragung. Json ist ein kompaktes Dateiformat das zur Übertragung von Daten genutzt wird und in so gut wie jeder Programmier- oder Scriptsprache eingesetzt werden kann.


    Graue Theorie

    Die Frage die sich als erstes stellt: "Was ist Ajax, brauch ich das überhaupt?". Zum Verwendungszweck kann man sagen, dass es nicht unbedingt nötig ist. Allerdings sind Webseiten die Ajax benutzen in der Regel Benutzerfreundlicher und vor allem schneller.

    Wenn man bei einer Webanwendung im klassischen Sinne, also ohne Ajax, eine Unterseite öffnet, wird ein Request an den Webserver gesendet. Dieser lieft einem dann die gesamte Website zurück, wobei jede Datei, z.B. ein Bild, extra angefordert wird. Jeder Content wird extra verarbeitet. Das öffnen eine Seite bedeutet also jede Menge Arbeit und Kommunikation für den Browser. Moderne Browser setzten auf aufwendige Caching Algorithmen um bereits bekannten Inhalt nicht noch einmal zu laden oder zu verwerten. Wenn eine Seite also einmal geladen wurde, dauert es in der Regel nicht mehr ganz so lange um weitere Unterseiten auf zu rufen, dennoch wird bei jedem Aufruf die gesamte Seite beim Server abgefragt.

    An dieser Stelle setzt Ajax an. Nachdem eine Seite geladen wurde, wird mittels Javascript nur noch der Teil der Seite nachgefordert der auch verändert wird. Javascript fragt also beim Server an und verarbeitet dann diese Antwort. Dies führt allerdings zu dem Problem, dass der Browser quasi übergangen wird. Dieser bekommt von dem Request nichts mit. Will man also in dem Browser-verlauf zurück gehen, funktioniert das in der Regel nicht. Ein weiteres Problem ist das Suchmaschinen wie Google die Unterseiten nicht aufrufen können.

    Es gibt bereits Lösungen für beide Probleme. Diese Bedarfen aber zusätzlicher implementations Arbeit.
    Für weitere Informationen zu diesem Thema empfehle ich die offizielle Google Präsentation. Ich selbst setzte zur Lösung dieser auf das Ajax-History-Plugin für jQuery von asual, jQuery Address

    Die Unterschiede zwischen den beiden Techniken wird in dieser Grafik von Wikipedia sehr deutlich:

    Quelle: Wikipedia - Ajax


    Los geht’s!

    So genug von diesem theoretischen Kram! Im folgenden wird möchte ich euch eine kleine Ajax basierend Webanwendung zeigen die das Prinzip verdeutlichen soll. Probiert ruhig immer wieder die Zwischenschritte aus!

    Zu erst einmal braucht ihr die aktuelle jQuery. jQuery ist ein freies JavaScript Framework welches komfortable Funktionen zur DOM-Manipulation und -Navigation bietet. Es steht unter http://jquery.com zum Download zur Verfügung.

    Ich lege in meinem Projektordner 2 Dateien an und füge jQuery hinzu.
    index.html ist mein Startdokument. ajax.php dient zur Server seitigen Verarbeitung meines Ajax-Requests.

    HTML-Grundgerüst
    HTML-Code:
    <!DOCTYPE html> 
    <html>
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <script type="text/javascript" src="jquery.js"></script>
    <script type="text/javascript">
    // jQuery folgt hier
    </script>
    </head>
    <body>
        enter your name: <input type="text" id="name" />  <br />
        <input type="button" id="buttonAjax" value="Call Ajax" />
        <div id="output"></div>
    </body>
    </html>
    Diese Grundgerüst dient uns als Ausgangsbasis. Es handelt sich um einen einfachen Button und ein Eingabefeld. In das Eingabefeld soll ein Besucher seinen Namen eintragen. Dann kann beim anklicken des Buttons ein Request abgesendet werden. Dessen Antwort wird dann in das "output" Div ausgegeben.

    der jQuery-Teil (Javascript)
    Code javascript:
    1
    2
    3
    4
    5
    
    <script type="text/javascript">
    $(document).ready(function(){
        alert("loaded");
    );
    </script>

    Syntax
    Dieses kleine Beispiel zeigt wie ein Event an ein jQuery Objekt "gehängt" wird. Bei $(document) handelt es sich um das Objekt, an das Event .ready() gehängt wird. Dieser wird eine Funktion übergeben die beim auftreten des Events ausgeführt wird.

    jQuery Selektoren
    $(document) ist eine Möglichkeit einer Selektion. Hier wird einfach nur das bestehende Objekt um die Funktionalitäten von jQuery erweitert und ein neues Objekt erzeugt.
    Aber jQuery kann noch viel mehr! Dabei werden unter anderem die CSS-Selektoren benutzt. So kann mittels $("#id") ein einzelnes DOM-Objekt selektiert werden oder per $(".classname") eine Klasse von Objekten. Eine vollständige Übersicht aller möglichen Selektoren findet ihr in der jQuery-Api. Diese ist sehr zu empfehlen und nach meiner subjektiven Meinung einer der besten die es gibt.

    .ready();
    Javascript wird in der Regel am Anfang einer HTML-Seite definiert und somit auch mit als erstes geladen. Das Problem hierbei ist, dass dann auf weiter unten definierte DOM-Objekte noch nicht zugegriffen werden kann, da diese einfach noch nicht existieren. jQuery bietet hier für das .ready() Event. Dieser wird eine Funktion übergeben die aufgerufen wird sobald die gesamte Seite fertig geladen wurde.

    Code javascript:
    1
    2
    3
    4
    5
    6
    7
    
    <script type="text/javascript">
    $(document).ready(function(){
        $("#buttonAjax").click(function(){
            alert("button klicked");
        });
    );
    </script>
    Hier wird an den Button das .click Event gehängt. Wenn der Button dann betätigt wird, dann wir die übergebene Funktion aufgerufen. Diese ruft in diesem Fall einen einfachen alert auf.

    Code javascript:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    <script type="text/javascript">
    $(document).ready(function(){
        $("#buttonAjax").click(function(){
            var name = encodeURI($("#name").val());
            if(name == ""){
                alert("Bitte einen Namen angeben!");
            }else{
                // ajax request
            }
        });
    );
    </script>
    Um den Namen an den Server zu übergeben muss zuerst das Input-Feld ausgelesen werden (Zeile 4). Damit es keine Probleme mit der Kodierung gibt wird mittels der encodeURI-Funktion alle Zeichen die in einem Request eine Sonderbedeutung haben, wie = oder &. Der Wert des Inputfeldes wird der Variable name zugewiesen.
    Anschließend erfolgt noch keine Überprüfung, wenn der Name leer ist wird eine Fehlermeldung ausgeben.

    Code javascript:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    <script type="text/javascript">
    $(document).ready(function(){
        $("#buttonAjax").click(function(){
            var name = encodeURI($("#name").val());
            if(name == ""){
                alert("Bitte einen Namen angeben!");
            }else{
                $.ajax({
                    type: "POST",
                    url: "ajax.php",
                    data: "name="+name,
                    success: function(data){
                        alert(data);
                    }
                });
            }
        });
    );
    </script>
    Als nächstes wird die ajax Funktion des jQuery-Objekts aufgerufen, alternativ zu $ kann man auch jQuery schreiben. Dieser wird ein Objekt übergeben das die Eigenschaften festlegt sowie Funktionen in bestimmten Events ausführt. Zum einem Wird der Request-type (type) festgelegt, in diesem Falle ist das Post. Die URL wohin der Request geht.
    Die zu übergebenden Daten bei data angegeben. Daten müssen Key-Value-Paare sein. Der Syntax ist recht einfach: key = value & key = value.
    Wenn das Event "succes" eintritt wird die definiert Funktion aufgerufen. Diese gibt in einem alert die Antwort des Requests aus.
    PHP-Code:
    <?php
    if(!empty($_POST['name'])){
        
    $ret = Array("hello" => "Hallo ".$_POST['name'], "ip" => $_SERVER['REMOTE_ADDR'] );
        echo 
    json_encode($ret);
    }
    Dieser Request wird von diesem kleinen PHP Script ausgewertet. Der übergebene Name wird nochmals überprüft und dann an den String Hallo gehängt und in ein Array gespeichert. Das Array wird um die IP erweitert und wird dann mittels json_encode in einen Json-String codiert und mittels echo ausgeben.

    Code javascript:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    <script type="text/javascript">
    $(document).ready(function(){
        $("#buttonAjax").click(function(){
            var name = encodeURI($("#name").val());
            if(name == ""){
                alert("Bitte einen Namen angeben!");
            }else{
                $.ajax({
                    type: "POST",
                    url: "ajax.php",
                    data: "name="+name,
                    success: function(data){
                        var json = $.parseJSON(data);
                        $("#output").html(json.hello+"<br />your ip: "+json.ip);
                    }
                });
            }
        });
    );
    </script>
    Dieser Json-String steht dann im data Parameter der an success übergebenen Funktion. Dieser wird mittels der parseJSON Funktion von jQuery in ein Javascript-Objekt umgewandelt.
    Mit Hilfe dieses Objektes wird ein String zusammengestellt und in das Ausgabe div geschrieben.


    Thats it!
    Das war es eigentlich im großen und ganzen. Sicherlich handelt es sich hier um ein kleines Beispiel was niemals das volle Potenzial von Ajax zeigt, allerdings sollten die Grundlegende Funktionalität damit deutlich werden. Ich hoffe das ich euch den Umgang jQuer näher bringen konnte.

    Bitte verzeiht eventuelle didaktische Fehler, es ist mein erstes Tutorial. Ich hoffe das ich tutorials.de einiges an Potenzial und Zeit zurück geben konnte, mich begleitet das Forum seit den Anfängen meiner Programmierarbeit und ist immer noch ein guter Ansprechpartner.

    In diesem Sinne, viel Spaß beim code!

    Zack
    mojitoweb, zer0 und Dampfhammer bedanken sich. 


    Kommentare 1 Kommentar
    1. Avatar von zer0
      zer0 -
      Schönes Tutorial!

      Jedoch kodiert encodeURI aber eben nicht die Zeichen '&' und '='. Dafür muss man encodeURIComponent verwenden.

      Siehe http://de.selfhtml.org/javascript/ob...htm#encode_uri
    Kommentare Kommentar schreiben

    Klicke hier, um dich anzumelden

    Was ist grün und kann quaken?