viagra generic canada
viagra cheap generic
viagra softabs
real viagra woman
viagra cialis canadian pharmacy
generic viagra tab
sales online viagra
online medications viagra
viagra cost in canada
viagra 50 mg
order viagra or levitra
viagra argentina
viagra online pharamcy
viagra cheap sale
viagra 100mg dosage
viagra generic on line
order viagra cialis levitra pharmacy
order viagra without prescription
sale viagra
online perscriptions for viagra
viagra generic soft tabs 100mg
sales uk viagra
viagra cost
viagra cialis store
online viagra for sale
low cost viagra
where to buy viagra in london
viagra cheap online rx
get viagra now internet
online pharmacy prescription drug viagra
viagra price uk
viagra prescriptions uk
viagra buy general
viagra uk without prescription
where can i purchase viagra
viagra buy it
viagra to buy
viagra best prices
order cialis and viagra
viagra in usa
order prescription viagra without
viagra cheapest uk
where to purchase viagra
viagra on internet prescription online
viagra get prescription online
get viagra in canada
viagra price online
viagra online without prescription
order viagra prescription
viagra soft tabs low cialis
viagra buy australia
purchase viagra without prescription
online cheap viagra
purchasing viagra australia
viagra without perscription
lowest price on viagra
viagra cheapest price
no online pharmacy prescription required viagra
viagra canada prescription
viagra on line no prescripton
generic viagra solf tabs
purchase viagra soft tabs
purchasing viagra in venezuela
viagra by mail canada
online store viagra
no prescription order viagra online
viagra buying online
viagra generic discount
viagra on line sales
viagra genetic
us discount viagra
on line generic viagra for sale
online order viagra
viagra united states
viagra usa mastercard
online viagra prescription canada
viagra online
viagra cialis canada
viagra cialis online
viagra cialis online pharmacy satisfaction guaranteed
ordering generic viagra in canada
viagra online rx
generic viagra rx
viagra canada generic
non prescription viagra
where to get viagra
viagra in the uk
mail order viagra online
where to buy viagra uk
viagra in mexico
viagra online no rx
online pill viagra
get viagra drug online
viagra cheapest prices
viagra on line purchase
online uk viagra sales
uk viagra on line
viagra cheap prescription
online viagra canada
get viagra without prescription
viagra uk cheap
viagra prices in usa
viagra cost uk
viagra best buy
viagra 100mg
viagra on the internet
online ordering viagra
low price for viagra
order viagra here
generic viagra uk
viagra cialis buy no prescription
viagra prescription order
no prescription viagra
uk viagra sales online
viagra discount sales
order viagra without a prescription
purchase cheap viagra online
purchase viagra professional
viagra cheap
generic viagra pills
purchase viagra by check
viagra 100mg tablets
uk viagra online
online viagra pharmacy
viagra pharmacy sales london
on line pharmacy for viagra
viagra canadian price shipped
viagra on line order
generic viagra without visa
viagra in uk
order mexican viagra
online viagra no generic
mail order viagra in uk
viagra pharmacy online
viagra in britain
where can i buy viagra in
viagra to order
order viagra now viagra money order
order 50mg viagra
no rx viagra
viagra no presrciption
lowest viagra prices
viagra to buy in uk
viagra 50mg
viagra cheapest
viagra buy in uk online
lowest price generic viagra
viagra online no doctor prescription
order viagra online no rx prescription
viagra cost best price viagra
viagra purchase
viagra generico impotencia
purchasing viagra in mexico
viagra prescriptions online
order generic viagra online
viagra canada
where can i get viagra
sales of viagra
viagra cheap uk
viagra buy generic
getting viagra in the philippines
mail order viagra uk
viagra online ordering
order viagra overnight delivery
generic viagra softabs
online viagra
sale online viagra
viagra with out prescription
viagra in australia
order viagra online
real viagra online for americans
us drugs store cheap viagra
viagra without prescription new york
generic viagra with money order
viagra pills online
viagra no prior prescription
where to buy viagra
mail uk viagra
lowest priced viagra in britain
viagra cialis online pharmacy
viagra 100 50 25
non prescription viagra in uk
viagra online shop
viagra canida
viagra generic uk
online viagra order
uk viagra kamagra
get viagra without a prescription
order generic viagra
viagra by mail
generic viagra soft pharmacy online
pharmacy purchase viagra
viagra without prescription
viagra american express canada
lowest cost of viagra
viagra best price generic
viagra online canada
lowest cost viagra
viagra cost per pill
generic viagra sale
viagra uk retail price
viagra online pharmacies
generic viagra us licensed online pharmacy
generic viagra us pharmacy
on viagra
viagra 25mg
viagra prescriptions on line
viagra canada satisfaction guarantee
viagra without presciption online
uk viagra prices
viagra prescription uk
online shop viagra
sales viagra
get viagra
viagra online store
ordering viagra
get viagra now no doctor visit
where to buy viagra online
order viagra canada
uk viagra sales
viagra germany
viagra cost australia
viagra by the pill
get viagra online
where do i buy viagra online
purchase viagra in uk
viagra on prescription
generic viagra propecia
viagra to buy uk
viagra online discount
viagra best price
where to buy viagra from
generic viagra sales
non perscription viagra
no perscription viagra
on line pharmacy viagra
viagra without precription
online viagra sales
viagra cheap buy
viagra canada price
where can i buy viagra on
viagra by overnight delivery
viagra 50mg or 100mg
viagra 50mg uk
ordering viagra without prescription
get viagra prescription online
get viagra now
online viagra pills
viagra in the philippines
viagra online stores
tadalafil viagra
viagra soft tabs generic 100mg
purchasing viagra online
viagra 100
pharmacy viagra
viagra uk sales
viagra 50mg 100mg
viagra canada online
order viagra softtabs
on line generic viagra
viagra 25
no persription viagra
viagra generic cheap
where to buy viagra in nz
viagra soft tab
purchase viagra and cialis
online pharmacy viagra no prescription
viagra pill on line
online generic viagra sales
online parmacy viagra cheap
viagra on line
viagra best price sildenafil
order viagra on line
viagra cialis no prescription required
online sales viagra
no prescription cheap viagra
viagra in netherland
order discount viagra
uk cheapest viagra
viagra buy viagra
viagra purchase uk
nonprescription viagra
viagra buy oonline
viagra uk cheap purchase buy
viagra cheap no prescription
viagra best prices fda approved
viagra price australia
order viagra usa
no online order prescription viagra
viagra soft tab generic
viagra online pharmacy
viagra on line prescription
viagra discounts
viagra uk buy
viagra 50mg online
lowest price viagra online
pure theatrical viagra
where can i buy viagra online
online viagra australia
low price viagra
low priced viagra chain store
viagra purchase canada
online viagra levitra cialis
where can i purchase viagra online
ordering viagra online
viagra pills for sale
viagra buy online
purchasing viagra online for cheap
viagra cialis on line
viagra online cheap
online prescription for viagra
viagra no prescreption
lowest priced viagra in the uk
non perscription generic viagra
viagra on line canada
viagra canada online pharmacy
online pharmacy viagra
viagra generic buy
viagra canadian
viagra by money order
viagra generic buy online american express
viagra buy it online now
viagra prices uk
lowest price for viagra online
viagra generic cialis
where can i buy viagra uk
viagra non prescription
viagra online fda
viagra pills cheap
purchasing viagra
online free sample viagra canada
viagra without a prescription
viagra on lilne
low priced viagra
viagra cheap canada
purchase generic viagra uk
order viagra now money
viagra online purchase
non prescription viagra online
viagra pill uk
viagra pills uk
viagra price canada
viagra pills without a prescription
viagra to buy online
on line viagra american pharmacy
purchase viagra on line
viagra online shop uk
viagra online in canada
viagra pharmacy online sale
where buy viagra
online uk viagra
purchase viagra uk
generic viagra purchase
online buy viagra
viagra cheap mexico
sales online viagra sale
viagra uk online
lowest viagra price
viagra buy
viagra online without rx
viagra cialis generic
lowest cost generic viagra
viagra online prescriptions
viagra in ontario
online pharmacy uk viagra
viagra online shop online approval
online check payment viagra
viagra no prescription needed
viagra usa
viagra online prescription
order viagra overnight shipping
uk viagra
where can i order generic viagra
viagra generico mexico
lowest prices viagra
low cost viagra online
on line prescription viagra
online generic viagra
online viagra sale
real viagra
viagra without a perscription
mail order for viagra tablets
viagra 50
where can i buy viagra
no online prescription viagra
get viagra dont visit a doctor
generic viagra softtabs
order viagra viagra online
order viagra
viagra costs australia
generic viagra soft tabs
viagra to florida
online purchase viagra
viagra soft tablets
where to buy viagra on line
uk generic viagra
viagra on-line
online viagra uk
purchase viagra online
viagra best buy diet pills
viagra online uk no generic
online viagra prescriptions
tadalafil cialis vs viagra
lowest prices viagra uk
uk pharmacies cheap viagra
viagra generic cheap discounted cheapest online
viagra purchases
viagra online uk
low cost generic viagra
online viagra prescription
viagra no prescripsion
order viagra viagra
viagra online from us pharmacys
viagra best quality lowest prices
viagra cost per pill in mexico
generic viagra with american express
online order prescription viagra
on line viagra
generic viagra woman
viagra purchase online
viagra on line uk
viagra onlin
mail order viagra
where can i buy viagra from
viagra 50 mg or 100mg
online pharmacy prescription viagra
mail order viagra without prescription
lowest prices on generic viagra
viagra online no prescription
generic viagra usa
viagra amsterdam
viagra cialis online sales
order viagra cheap
viagra canadian prescriptions
tadalafil generic viagra
get discount viagra online
us viagra cheap
where do i buy viagra in
viagra u s pharmacies
viagra buy now pay later
viagra generic mastercard precription
viagra discount sale
order viagra licensed pharmacies online
viagra canadaian prices
viagra online in united states
uk viagra london
viagra no prescription canada
viagra in spain
non-prescription viagra
viagra prescription onlin
viagra online sales
online prescription viagra without
order viagra online uk
purchase generic viagra
viagra uk sale
viagra buying
viagra discount
viagra online canadiain
viagra 100 mg
get viagra on internet
lowest price viagra
low priced purchase viagra
viagra best prices fda approved online
online pharmacy viagra cialis
viagra discount online
purchase viagra in australia
order viagra on-line
order uk viagra
viagra purchase on line
viagra soft tablet
order viagra uk
viagra prescription online
viagra without prescription canada
viagra buy viagra online
viagra cheap usa
online viagra store
viagra 100mg 90 pills
where to get viagra samples
viagra in canada
where to buy viagra in uk
generic viagra sale on line
viagra softtabs
viagra generic buy american express
online pharmacy propecia viagra
viagra cialis cheap
online sale viagra
get online viagra
viagra cheap online
viagra no prescription
viagra onlines
viagra no presciption
pharmacy online viagra
mail order generic viagra
viagra 50mg soft tab generic
sale uk viagra
lowest price viagra in the uk
generic viagra online pharmacy
viagra american express
where can i get free viagra
viagra without a prescriotion
no perscription generic viagra
viagra online buy
on-line viagra
viagra cialis prescription online
viagra philippines
viagra on sale
viagra online shop in uk
order prescription viagra
viagra uk delivery
purchase generic viagra online
viagra by mail order
viagra buy uk
viagra generic drug
viagra uk purchase
purchase of viagra
viagra canada pharmacy
viagra online uk delivery
us viagra
viagra online order
generic viagra uk online pharmacy
viagra generic sildenafil
order cheap viagra
viagra purchase in united states
get viagra online guarantee
generic viagra tadalafil
order viagra onlines
nonperscription viagra
order viagra with mastercard
mail online order viagra
generic viagra pill
viagra discount store
generic viagra soft tab
viagra onliine
online phamacy viagra
viagra soft tabs
viagra on line pharmacy
online prescription viagra
purchase viagra
viagra uk
viagra generico
order viagra now

Weblog von Denny Carl mit den Schwerpunkten Programmierung und Webwork

Tutorial: Shoutbox als AJAX-Anwendung

10. November 2005 | PHP, AJAX | Kommentieren »

Die Funktionsweise von AJAX ist geradezu prädestiniert für eine Chat- oder Shoutbox, die mit weit verbreiteten Bordmitteln von Standard-Webservern und -browsern funktioniert. Im folgenden Tutorial soll ein einfacher Chat entstehen, der komplett auf Flash, Java, o. ä. verzichtet und dennoch ohne ständigem Reload der Website arbeitet.

1. Funktionen und Techniken

Die Shoutbox, die am Ende dieser Anleitung entstanden sein wird, besteht aus validem XHMTL, schick gemacht mit CSS. Funktionen zum Abrufen und Speichern der einzelnen Nachrichten werden auf dem Webserver, der unbedingt erforderlich ist, mit PHP realisiert. Sämtliche Daten werden in einer mySQL-Datenbank gespeichert. Mit AJAX, genauer mit JavaScript und dem XmlHttpRequest-Objekt, entsteht das Herzstück der Anwendung. Der Chat läuft auf allen aktuellen Versionen von Internet Explorer, Firefox und Opera.

2. Das Front-End

Die Shoutbox selbst ist schnell gezimmert: Ein paar Block-Elemente, Eingabefelder und ein Button zum Absenden reichen vollkommen aus. Grundsätzlich müssen zwei Bereiche eingerichtet werden: Einerseits ein Bereich zum Anzeigen bisheriger Nachrichten, ein weiterer zum Eingeben von Name und Nachricht. In diesem Tutorial soll das folgendermaßen aussehen:

Oder in Form von w3c-konformem XHTML-Code:

<div id="asb_container">
 <div id="asb_contentwrap">
  <div id="asb_content">
   Shoutbox wird geladen ...
  </div>
 </div>
 <div id="asb_inputwrap">
  <div id="asb_input">
   <form action="" name="frmshoutbox" onsubmit="saveData(); return false;">
    <b>Name:</b><br /><input class="text" type="text" name="txtname" value="" /><br />
    <b>Nachricht:</b><br /><input class="text" type="text" name="txtmessage" value="" /><br />
    <input class="button" type="submit" name="btnsend" value="Senden" />
   </form>
  </div>
 </div>
</div>

Einzelne Elemente wurden mit eindeutigen Namen versehen, damit es CSS und JavaScript leichter fällt, Teile der Shoutbox zu identifizieren und anzusprechen - mehr dazu gleich. Die Ausgabe bisheriger Nachrichten erfolgt in einem div mit der id asb_content. Die Eingabe erfolgt über eine form mit zwei Éingabefeldern. Drückt man in selbigen die Enter-Taste oder betätigt man den Senden-Button, wird die Nachricht verschickt.

Im momentanen Zustand sieht die Shoutbox noch relativ nackt aus. Ein Ansatz von XHTML war es ja schließlich auch, schmückende Elemente aus HTML zu entfernen und nur noch strukturierend tätig zu sein. Nun darf CSS seine Macht entfalten, mit diesem Stylesheet:

form {
 margin: 0px;
}
 
#asb_container {
 border: 1px dashed #B52021;
 width: 160px;
}
 
#asb_contentwrap {
 font: 8pt Arial;
 height: 200px;
 background-color: #DDDDDD;
 overflow: auto;
}
 
#asb_content {
 margin: 5px;
}
 
#asb_content .name {
 color: #555555;
 font-weight: bold;
 padding-right: 5px;
}
 
#asb_inputwrap {
 font: 8pt Arial;
}
 
#asb_input {
 margin: 5px;
}
 
#asb_input .text {
 border: 1px solid #888888;
 font: 8pt Arial;
 width: 146px;
 background-color: #f4f4f4;
}
 
#asb_input .button {
 width: 50px;
 margin-top: 4px;
 background-color: #B52021;
 font: bold 8pt Arial;
 color: white;
 border: 1px solid #888888;
}

Grundsätzlich sind zum CSS-Teil nur zwei Dinge anzumerken: 1. Dem form-Tag wurde der hauseigene Außenrand entzogen, der sich gern mal unansehnlich ausbreitet. 2. Die Definition asb_contentwrap beinhaltet overflow: auto. Damit wird automatisch eine vertikale Scrollbar angezeigt, sollten einmal die darzustellenden Nachrichten nicht in die feste Größe der Shoutbox passen.

3. Nachrichten speichern

Sämtliche Nachrichten werden in einer mySQL-Datenbank gespeichert, eine einzige Tabelle genügt, nennen wir sie treffenderweise shoutbox. Sie enthält die Felder name, message und, wie sich das gehört, id als Primärschlüssel. In SQL ausgedrückt, sieht das so aus:

CREATE TABLE shoutbox (
  id int(11) NOT NULL auto_increment,
  name varchar(50) NOT NULL default '',
  message tinytext NOT NULL,
  PRIMARY KEY  (id)

4. Ein- und Auslesen von Nachrichten

Zwei PHP-Skripten kümmern sich nun darum, die eben erstellte Datenbanktabelle mit Nachrichten zu füllen und selbige auch wieder zu lesen. Ein drittes Skript beinhalt alle Einstellungen für den serverseitigen Bereich der Anwendung, nennen wir es config.php:

<?
//Datenbank-Einstellungen
$dbhost='localhost';
$dbuser='username';
$dbpass='password';
$db='db1';
$dbtable='shoutbox';
 
//Anzahl der auszugebenden Nachrichten
$messages_count = 10;
?>

$messages_count soll das Ausgeben bereits bestehender Nachrichten auf eine gewisse Anzahl einschränken. Ansonsten würde getdata.php bei jeder Anfrage alle Datensätze ausgeben und unnötig Traffic verursachen. Erschwerend kommt hinzu, dass getdata.php relativ oft aufgerufen wird, mehr dazu gleich.

Das Skript baut, basierend auf den Einstellungen aus config.php, eine Datenbankverbindung auf. Mittels SQL werden die neuesten Nachrichten aus der Datenbanktabelle gefischt und ausgegeben. Die Ausgabe erfolgt mit Hilfe von HTML-Tags. Das ist nicht unbedingt die professionellste Variante, schließlich kümmert sich ein serverseitiges Datenbankabfrageskript um die optische Gestaltung einer browserseitigen Angelegenheit. Aber wollen wir es nicht komplizierter machen, als es sein muss.

Übrigens: Manch’ Browser packt getdata.php bei einem Aufruf in den Cache und weigert sich, bei einem nächsten Aufruf die Datei erneut vom Server zu laden um die lokal gecachte Version zu nutzen. Das Todesurteil für jede chatähnliche Anwendung. Daher beginnt das Skript mit einigen Funktionen, die den Browser von diesem Blödsinn abzuhalten.

<?php
//Cachen verhindern
header("Expires: Sat, 05 Nov 2005 00:00:00 GMT");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
 
//Einstellungen laden
include("config.php");
 
//Verbindung zu mySQL aufbauen
$dblink = mysql_connect($dbhost, $dbuser, $dbpass);
if (!$dblink) {
   die('Keine Verbindung zur Datenbank möglich.');
}
 
//Datenbank auswählen
$dbselected = mysql_select_db($db, $dblink);
if (!$dbselected) {
   die ('Kann Datenbank nicht erreichen.');
}
 
//Datensätze ermitteln
$dbresult = mysql_query("SELECT * FROM $dbtable ORDER BY ID DESC LIMIT 0,$messages_count");
if (!$dbresult) {
   die('Ungueltige SQL-Query.');
}
 
//Datensätze auslesen und formatieren
while ($row = mysql_fetch_assoc($dbresult)) {
   echo "<span class="name">".$row["name"].":</span>";
   echo $row["message"]."<br />";
}
 
//Verbindung zur Datenbank schließen
mysql_close($dblink);
?>

setdata.php schreibt neue Nachrichten in die Datenbanktabelle shoutbox. Dabei ist zu beachten, dass die Daten per POST-Methode aus dem Eingabebereich der Shoutbox übertragen werden.

<?php
//Einstellungen laden
include("config.php");
 
//Verbindung zu mySQL aufbauen
$dblink = mysql_connect($dbhost, $dbuser, $dbpass);
if (!$dblink) {
   die('Keine Verbindung zur Datenbank möglich.');
}
 
//Datenbank auswählen
$dbselected = mysql_select_db($db, $dblink);
if (!$dbselected) {
   die ('Kann Datenbank nicht erreichen.');
}
 
//Neuen Datensatz speichen
$result = mysql_query("INSERT INTO $dbtable (name, message) VALUES ('".$_POST["name"]."','".$_POST["message"]."')");
if (!$result) {
   die('Ungueltige SQL-Query');
}
 
//Verbindung zur Datenbank schließen
mysql_close($dblink);
?>

5. Die AJAX-Schaltzentrale

Die lästigen Vorarbeiten sind getan, kommen wir nun zum Herzstück der Shoutbox. AJAX nimmt die Eingaben aus den Eingabefeldern entgegen und versorgt setdata.php mit der neuen Nachricht. AJAX sorgt aber auch dafür, ständig die neuesten Nachrichten auf dem Schirm zu holen - vielleicht ja von anderen Nutzern der Shoutbox. Dafür wird regelmäßig getdata.php abgerufen. Das beste daran: Die Seite, auf der die Shoutbox enthalten ist, muss dafür nicht ständig neu geladen werden, wie es ohne AJAX nötig wäre. Man stelle sich nur einmal vor, die Shoutbox befände sich nicht allein auf einer Website, sondern zusammen mit anderen Texten, Bildern, usw. Das ist wohl der wahrscheinlichere Fall, nicht wahr?! Jeder Besucher würde wohl bald flüchten, müsste er alle paar Sekunden ein Neuladen der kompletten Site ertragen.

Bevor wir munter dank AJAX mit den PHP-Skripten auf dem Server kommunizieren können, müssen Vorbereitungen getroffen werden. Das XMLHttpRequest-Objekt, Basis von AJAX, muss beim Aufrufen der Seite erstellt werden, um es später nutzen zu können. Dazu wird eine Instanz erstellt und der globalen Variable xmlHttp zugewiesen. Beim Internet Explorer ist XMLHttpRequest ein ActiveX-Objekt, bei der Konkurrenz ist es Bestandteil des Browsers. Hinzu kommt, dass das XMLHttpRequest-Objekt beim IE unterschiedlich angesprochen werden kann. Diesen Umständen wird z.B: mit try-catch-Blöcken Rechnung getragen: Schlägt eine Möglichkeit, XMLHttpRequest zu instanziieren, fehl, wird eben die nächste probiert.

Sollte das Erstellen der Instanz letzlich doch geglückt ist, werden die neuesten Nachrichten vom Server geladen. Stand eben noch “Shoutbox wird geladen…” (siehe HTML-Template oben) auf dem Schirm, breiten sich jetzt Namen und Texte aus - sofern vorhanden. Die JavaScript-Funktion loadData kümmert sich darum. Damit immer wieder und wieder ein Nachrichten-Update erfolgt, wird diese Funktion regelmäßig abgerufen. Dazu nutzen wir setInterval.

//globale Instanz von XMLHttpRequest
var xmlHttp = false;
 
//XMLHttpRequest-Instanz erstellen
//... für Internet Explorer
try {
    xmlHttp  = new ActiveXObject("Msxml2.XMLHTTP");
} catch(e) {
    try {
        xmlHttp  = new ActiveXObject("Microsoft.XMLHTTP");
    } catch(e) {
        xmlHttp  = false;
    }
}
//... für Mozilla, Opera, Safari usw.
if (!xmlHttp  && typeof XMLHttpRequest != 'undefined') {
    xmlHttp = new XMLHttpRequest();
}
 
//aktuelle Daten laden
loadData();
 
//alle 5 Sekunden neue Daten holen
setInterval("loadData()",5000);

Was genau passiert nun in loadData? xmlHttp wird beauftragt, die Datei getdata.php vom Server abzurufen und bei Erfolg den Inhalt in der Shoutbox auszugeben. Über die Eigenschaft readyState erfahren wir, wann genau dieser Moment eingetroffen ist. readyState hat dann den Wert 4. Ändert sich diese Eigenschaft, tritt das Ereignis onreadystatechange ein, welches wir mit einer Funktion (in diesem Beispiel in Form einer inline-Funktion) behandeln. Über die Methode getElementById steuern wir unseren div-Tag mit dem Namen asb_content an und verändern die Eigenschaft innerHTML. Dort stehen dann die neuen Nachrichten.

function loadData()
{
 if (xmlHttp) {
     xmlHttp.open('GET', 'getdata.php', true);
     xmlHttp.onreadystatechange = function () {
         if (xmlHttp.readyState == 4) {
             document.getElementById("asb_content").innerHTML = xmlHttp.responseText;
         }
     };
     xmlHttp.send(null);
 }
}

Interessant an dieser Stelle: Das erste A in AJAX steht für Asynchronous. Das heißt, sämtliche Abläufe auf der Website laufen unabhängig von unserer Anfrage an den Server weiter. Liefe der Prozess synchron weiter, müssten die Abläufe auf der Website gestoppt werden, bis die Daten komplett übertragen worden sind. Um aber dennoch die Kontrolle über den Datentransfer zu behalten, nutzt man die Ereignisbehandlung.

Um eine Nachricht an den Server zu senden, versorgt die JavaScript-Funktion saveData das Skript setdata.php per POST-Methode mit den Benutzereingaben. Wir nutzen POST, um den Beschränkungen von GET (maximal 256 Zeichen Text) aus dem Weg zu gehen. Die Daten werden in Form von Parametern weiter gegeben, die die Methode send des XMLHttpRequest entgegen nimmt. savedata.php schreibt die erhaltenen Daten in die Datenbank.

Es gibt noch ein Problem: Normalerweise wird eine Seite neu geladen, wenn man in einem HTML-Formular Enter drückt oder den Senden-Button betätigt. Das Neuladen wollen wir natürlich unbedingt verhindern, dennoch nicht auf die Annehmlichkeiten etwa der Enter-Taste verzichten. Das onsubmit-Ereignis einer form wird ausgelöst, sobald das Formular abgeschickt werden soll. Da klinken wir uns ein und leiten an dieser Stelle zu unserer Funktion saveData um. Diese verschickt die Daten und kehrt zur Behandlung von onsubmit zurück. Da damit aber alles erledigt ist, was wir wollen, brechen wir einfach die weitere Abarbeitung des Formulars ab. Dies erfolgt mit return false. Vielleicht haben ja einige diesen “Hack” bereits ganz am Anfang im HTML-Teil entdeckt? Damit das Ganze dennoch wirkt, wie von einem Formular gesendet, setzen wir mit der Methode setRequestHeader eine entsprechenden Header. So kommt setdata.php mit den übergebenen Daten hunderprozentig klar. Die Funktion saveData komplett:

function saveData()
{
 if (xmlHttp) {
     xmlHttp.open('POST', 'setdata.php');
     xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
     xmlHttp.send('name='+document.frmshoutbox.txtname.value+'&message='+document.frmshoutbox.txtmessage.value);
 }
 document.frmshoutbox.txtmessage.value = '';
 document.frmshoutbox.txtmessage.focus();
}

Am Ende der Funktion wird dafür gesorgt, dass das Nachrichteneingabefeld geleert wird und bereit für neue Eingaben ist. Um das zu vereinfachen, wird zu guter letzt noch der Fokus dorthin versetzt.

6. Erweiterungsmöglichkeiten

Das obige Beispiel ist recht einfach gehalten und offen für Erweiterungen aller Art. Wie wäre es etwa, noch Datum und Zeit jeder Nachricht anzuzeigen?

Ein echtes Highlight wäre zweifelsohne auch, diese AJAX-Applikation noch AJAX-konformer zu machen - indem getdata.php die Daten nicht als HTML-Schnippsel zurückgibt sondern als XML-Datei. Dann müsste sich JavaScript darum kümmern, die XML-Daten zu verarbeiten.

Die komplette Anwendung als Download.

Verwandte Artikel

AJAX extrem einfach: Ein Bildbetrachter mit AJAX Source Kit | NewsAlloy - Web 2.0 und AJAX in Bestform | AJAX. Oder: Von einem revolutionären Megatrend.

Tags

, , , , , , , ,

Bookmarken

:Tutorial: Shoutbox als AJAX-Anwendung :Tutorial: Shoutbox als AJAX-Anwendung :Tutorial: Shoutbox als AJAX-Anwendung  :Tutorial: Shoutbox als AJAX-Anwendung :Tutorial: Shoutbox als AJAX-Anwendung

Trackback

http://www.devblog.de/index.php/archives/2005/11/10/52/trackback/

38 Kommentare zu “Tutorial: Shoutbox als AJAX-Anwendung”


  1. Die E meint:

    Hallo. Es sieht ganz gut aus. Es gibt nur ein Problem: die deutschen Umlaute und Sonderzeichen werden nicht korrekt in der DB abgespeichert und angezeigt trozt Westeuropäischen Codierung bei den Browsern und

    Bitte um Hilfe. Vielen Dank. E.


  2. Denny meint:

    Eigentlich sollte es keine Probleme mit Umlauten geben. Die Shoutbox ist in UTF-8 kodiert, das sollte Dein Browser eigentlich selbst erkennen. UTF-8 ist Unicode, alle Umlaute der ganzen Welt ;-) sind dort enthalten. Allerdings darfst Du ihn natürlich nicht zwingen, eine westeuropäische Kodierung zu nutzen, das passt dann nicht zusammen. Welchen Browser nutzt Du denn?

    Denny


  3. Taps meint:

    Probleme mit den Umlauten kann man durch die Function escape bei JS wegbekommen.
    man escapt einfach die Daten die gesendet werden sollen und bei der zb. verarbeitenden PHP datei urldecodet man diese halt wieder bevor sie in die DB geschrieben werden.

    ALso klappt ganz gut.

    by Taps


  4. AJAX meint:

    Sehr interessant, danke. Weitergehende Infos zum Thema AJAX gibts übrigens auf http://www.ajax-community.de/


  5. Mo meint:

    Sehr sehr schönes Script.
    Wie müsste man es abändern, dass die neuesten Beiträge vom unteren Rand hinzugefügt werden?


  6. michi meint:

    nettes Script! Aber eine Frage hätte ich noch: ist es möglich, dass wenn man was shoutet, die Shoutbox sofort neugeladen wird?


  7. Ajax -Einführung » Webdesignblog meint:

    […] Ein besseres Beispiel (wie ich finde) ist dieses Tutorial von devblog.de. Dort wird ein Chat programmiert, jeder Schritt ist detailiert beschrieben, auf Voraussetzungen wird hingewiesen (PHP und Mysql-Datenbank) und man ist schnell durch (erste Ergebnisse sind früh zu sehen). Ausserdem macht dieses Tutorial Lust auf mehr, man kann quasi direkt weitermachen. […]


  8. Manfred meint:

    Sehr schön beschrieben, vielen Dank!
    Fast der gleiche Ajax-Chat kann auf folgender Seite online getestet werden:
    http://www.plasticshore.com/projects/chat/


  9. Steffino meint:

    ich habe den chat - äh.. ich sag schon chat, die shoutbox meine ich, auf www.kitaimbogen.de eingebaut. mir gefällts, datum und zeit hab ich natürlich auch schon eingebaut. interessant wäre noch, html aus den nachrichten herauszufiltern bzw. nur bestimmte tags zu parsen.


  10. Tango meint:

    Sehr schönes Script, es ist nur etwas langsam bei der darstellung, also sobald mann eine nahchricht abschickt dauert es 5 sekunden biss es sich aktualisiert hatt.

    Wünche:

    Ich möchte nicht unferschämt sein aber, es währe auch schön wenn die alten beiträge auch sichtbar währen ?? endweder mit einem autoscroll oder einen scrollbox, und zusätzlich währe es schön wenn auch das Datum + Uhrzeit von den Nachrichten mit angezeigt würde


  11. Denny meint:

    Ich verspreche Euch, ich werde in Kürze ein Update veröffentlichen, welche eine Vielzahl der Kommentare und Wünsche berücksichtigt.


  12. Tango meint:

    @Denny das freut mich zu hören, wenn du noch Smilies einfügen würdest, währe es perfeckt.

    Gestern habe ich von @Steffino unheimlich viel hilfe bekommen, dank ihm habe ich jetzt einen shoutbox mit Datum & Uhrzeit und es wird nicht letzte 10 Beiträge angezeigt sondern alle 24 Stunden.

    wenn du jetzt auch noch mit dem Autoscroll (damit meine ich Marquee der von oben nach unten scrollt) einbaust oder einen anleitung erstellst würde ich dir dankbar sein.


  13. Odin meint:

    Nette Sache, nur leider habe ich eine Lösung für das AJAX Umlaute Problem gesucht :-(


  14. Odin meint:

    Die Umlautgeschichte kannst du so lösen:

    derStringDenDuAnDenServerSchickst = escape(derStringDenDuAnDenServerSchickst);

    Das wars.

    Hat jedenfalls bei mir geklappt.


  15. Steffino meint:

    Hallo,

    bitte benutzt die Shoutbox auf kitaimbogen.de nicht zum ausprobieren, das nervt auf Dauer ;-)
    alternativ würde ich denny darum bitten, meinen post vom 9. januar rauszunehmen


  16. Steffino meint:

    thx, klappt ja ;-)
    habe gerade bemerkt, dass der text abgeschnitten wird wenn man in der shoutbox ein ‘&’ eingibt. und gibt´s vielleicht schon ‘ne lösung für die unmittelbare anzeige eingegebener nachrichten?


  17. Steffino meint:

    mmh, ich dachte ich setze wegen der ‘&’-zeichen bei setdata.php mal ein ‘htmlentities’ rein (und bei getdata.php das entsprechende ‘html_entity_decode’) - aber irgendwie scheint das damit wohl auch nicht zu funktionieren…


  18. Tango meint:

    Wir warten sehensüchtig auf die neuerungen und auf die Bugfix ;)


  19. Steffino meint:

    Kleiner Tipp: Einfach in shoutbox.js innerhalb der Funktion saveData() die Funktion loadData() aufrufen. Dadurch wird der Inhalt der Shoutbox beim speichern gleich aktualisiert und man muss nicht 5 Sekunden warten bis die eingegebene Nachricht auftaucht.


  20. Steffino meint:

    mhh… ging das mit return-taste drücken schon vorher nicht? scheint so…


  21. Shubi meint:

    hab n problem…
    ich habs das ganze paket runtergeladen… wenn ich auf index gehe (noch nicht online) kommt am anfang “Shoutbox wird geladen … ” aber dann “”.$row[”name”].”:”; echo $row[”message”].”
    “; } // Verbindung zur Datenbank schlie?n mysql_close($dblink); ?>” und man kann nichts mehr schreiben bzw. senden :’( plz help

    gruß shubi


  22. Denny meint:

    @shubi: Ich vermute mal, Du hast das ganze ohne PHP-fähigen Server getestet - vielleicht meinst Du das ja auch mit “noch nicht online”. Mach’s mal online.

    @Steffino: Mit der Return-Taste gab es eigentlich bislang keine Probleme.


  23. seHaas meint:

    um das problem mit dem “&” zu beheben einfach den send-aufruf durch diese drei zeilen ersetzen und es funktioniert:

    var txtMessage = encodeURIComponent(document.frmshoutbox.txtmessage.value);
    var txtName = encodeURIComponent(document.frmshoutbox.txtname.value);
    xmlHttp.send(’name=’+ txtName +’&message=’+ txtMessage);

    bzw vllt noch in der datei getdata.php folgende zeile zum header hinzufügen:

    header(”Content-Type: text/html; charset=utf-8″);

    mfg seHaas


  24. Steffino meint:

    @Denny: Also ich meinte Returntaste drücken statt Submitbutton klicken, das geht bei mir nicht…
    @seHaas: Danke, hab das in der Datei shoutbox.js bei der Funktion saveData() eingebaut. Geht aber immer noch nicht, es wird auch in der Datenbank nichts gespeichert, was nach dem ‘&’ kommt.


  25. seHaas meint:

    @Steffino: probier mal die Var txtMessage per alert auszugeben ob er das “&” durch ein “%26″ ersetzt, weil wenn das funktioniert, dürfte es keine probleme geben. zur not könntest per ethereal schaun was er wirklich schickt ;-)


  26. Steffino meint:

    das problem ist, dass ich von javascript keine ahnung habe…


  27. Dr. Web Weblog » Blog-Archiv » Tutorialsammlung meint:

    […] Shoutbox als AJAX-Anwendung Im folgenden Tutorial soll ein einfacher Chat entstehen, der komplett auf Flash, Java und ähnliches verzichtet und dennoch ohne ständigem Reload der Website arbeitet […]


  28. Freddy meint:

    Perfekt. Funktioniert alles einwandfrei. Da kann man ja richtig was draus machen, wenn man nen Plan hat. Im Prinzip kann man ja alle Daten laden und speichern die man auf der Webseite haben will. Im Prinzip kann man dann mit einer einzigen html Seite für den gesamten Webauftritt auskommen. Faszinierend.


  29. Ben meint:

    Hallo, finde das TUT sehr gut aber leider klappt die Box bei mir nicht.
    Ich weis nicht was ich falsch gemacht habe.

    LINK: http://b-arnold.net/klasse/chat/chat.php

    es steht immer da Shoutbox wird geladen


  30. Denny meint:

    @Ben: In Deiner Datei fehlt völlig der Bezug zum JavaScript-Teil der Shoutbox. Du musst also noch shoutbox.js einbinden - siehe Beispiel-Dateien zum Downloaden.


  31. Mario meint:

    Hallo Leute,
    ich bin von dieser AJAX-Anwendung begeistert; habe nur ein kleines Problem. Die Funktion loadData(), die jede 5 Sek. die Daten aktualisiert, laüft unter Mozilla sehr schlecht und ruckartig. Auf meiner Seite habe ich neben der Ajax-Shoutbox auch mehrere Flash-Banner am laufen und die werden unter Mozilla jade 5 Sek. auch jedes mal aktualisiert…
    Wie könnte ich das Problem beheben?

    N.B.
    Das Problem habe ich nur bei Mozilla….

    Ciao Mario


  32. Thomas meint:

    Wahnsinns-Tutorial!
    Danke!


  33. Macromafia Blog » Blog Archive » Shoutbox mit AJAX meint:

    […] http://www.devblog.de/index.php/archives/2005/11/10/52/ […]


  34. Further meint:

    Hey, super Tutorial für Anfänger wie mich! :)

    Wäre super, wenn mir jemand genau erklären könnte, wie man das jetzt mit XML machen könnte. Ich habe mir bereits eine XML-Datei per PHP erstellen lassen, weiß allerdings jetzt nicht, wie diese ausgelesen und verarbeitet werden muss…

    Muss das .xml nach jedem Eintrag neugeneriert werden, oder gibt es da eine einfachere Lösung??

    Gruß und Danke,
    Further

    eMail: further@gmx.net


  35. Tom meint:

    wo kommt der quelltext von 3. hin?
    ich habe noch keine erfahrung mit my SQL.
    danke


  36. Mardyfox meint:

    sehr schönes script, gefällt mir sehr gut, hab mir mal die mühe gemacht es etwas umgeschrieben und ans PHPKIT angepasst nur leider lädt die shoutbox sich immer zu tode… siehe hier: http://testsite.userlosers.com


  37. Denny meint:

    @Tom: Der Quelltext zu 3. ist eine SQL-Anweisung. Sie bestimmt, wie die Datenbanktabelle aussehen soll, die die Daten der Shoutbox aufnehmen soll. Falls Du phpMyAdmin benutzt, kannst Du diese Anweisung dort unter “SQL” eingeben und schon wird die Tabelle erstellt.

    @Mardyfox: Hast Du auch die Datei shoutbox.js? Und liegt sie an der richtigen Stelle, so dass Deine Seite die Datei erreichen kann? Du brauchst shoutbox.js auch nur einmal einbinden, im head. Übrigens: Sieht sehr schick aus, finde ich. Wäre wirklich toll, wenn Du die Shoutbox zum Laufen kriegen würdest.


  38. Mardyfox meint:

    shoutbox.js muss doch direkt ins verzeichnis wo die anderen files hinkommen rein!?



Suche


Newsletter

Alle 14 Tage gibt es von mir News, Tipps und Tricks zu XHTML, CSS, JavaScripts, Webstandards und vielem mehr. Meine Webdesign Secrets gibt es kostenlos.

E-Mail-Adresse: