-
Webseiten Hosting/Server Referenzen Kontakt/Impressum

PHP, Ajax, Javascript, Server Push, Internet Explorer und die Sache mit dem readyState==3

<< Back to overview / Zurück zur Übersicht

Hinweis: Dieser Artikel stammt aus dem Jahr 2006. Die Informationen sind u.U. inzwischen überholt.
Ich muss vorausschicken, dass ich die Sache mit Ajax für einen riesigen Hype halte. Es wird z.Zt. so getan, als hätte man das Ei des Kolumbus entdeckt.
Dabei bin ich der Meinung, dass es sich nicht wirklich um eine Neuerung handelt, denn ähnliche Verfahren wurden bereits viel früher eingesetzt, noch bevor der grosse Ajax-Hype begann. Zudem gibt es derzeit nur sehr wenige wirklich brauchbare Anwendungsfälle für Ajax. Das grösste Problem stellen dabei immer noch Internet-User dar, die JavaScript bzw. Active-X-Controls (IE) ausgeschaltet haben bzw. dies durch eine Firewall verhindert wird. Seriösen Webseiten, die ein möglichst breites Publikum erreichen wollen, bleibt also der Einsatz von Ajax derzeit noch verschlossen.
In einem Admin-Bereich, in dem Daten verwaltet werden sollen, sieht die Sache schon etwas anders aus. Hier geht es nur um einen oder ganz wenige Rechner, die auf die Seiten zugreifen und bei denen es kein Problem darstellen sollte, ggf. Javascript zu aktivieren. Hier kann der Einsatz von Ajax an einigen Stellen durchaus sehr sinnvoll sein.
Besonderes Interesse hatte ich aber an readyState==3. Hiermit war es möglich, den derzeitgen Inhalt des HTTP-Request zu erhalten, noch bevor der Request beendet war ("server push", das entsprechende PHP-Skript muss lediglich nach jeder Ausgabe ein flush() ausführen). Dies bietet sich z.B. für Skripte an, die im laufenden Betrieb Status-Meldungen herausgeben, die dann angezeigt werden sollen.
Dabei stiess ich jedoch auf einige Probleme, die ich aber fast alle lösen konnte (z.B. Umgehung von GZip/Deflate). Ein Problem konnte ich leider nicht lösen: Diese Technik funktioniert nur unter Mozilla und
nicht
mit dem Internet Explorer.
Versucht man unter dem IE bei readyState==3 den responseText auszulesen, erhält man die Meldung:
The data necessary to complete this operation is not yet available.
Viele Köpfe haben sich darüber schon den Kopf zerbrochen (siehe z.B. "XMLHTTP and readyState"). Eigentlich zu unrecht, denn das Microsoft-Manual ist da leider ziemlich eindeutig (MS-Referenz):
(3) INTERACTIVE : Some data has been received. Calling the responseBody and responseText properties at this state to obtain partial results will return an error, because status and response headers are not fully available.
Man darf nur nicht den Fehler begehen und beim "ServerXMLHTTP"-Objekt nachschauen, denn dies würde zwar die gewünschte Funktion unterstützen, ist aber auf einem normalen IE-Browser nicht verwendbar.
Nach verschiedenen Tests entstand dieses Skript, welches eine Indizierung von Produkten simuliert:
Ajax-Test-Skript (Echtzeitausgabe nur unter Mozilla, IE zeigt nur das Endergebnis)
Dass es mit dem IE nicht in Echtzeit funktionierte, wurmte mich so sehr, dass ich mir einen komplett neuen Ansatz überlegt habe, der auch tatsächlich sowohl mit Mozilla/Firefox als auch dem Internet Explorer funktioniert. Das ganze ist sogar noch einfacher als das Ajax-Testskript.
Das Geheimnis: Im Hauptskript (dort erscheint die Ausgabe) wird ein IFrame definiert, indem das Kontrollskript geladen wird. Von dort werden dann die Ausgabetexte via JavaScript an das Hauptskript gesendet. Dies funktioniert, weil sowohl der IE als auch Mozilla vollständigen JavaScript-Code sofort auswerten, selbst wenn die Seite eigentlich noch nicht zuende geladen ist.
Hier muss man lediglich den Puffer des Internet Explorers überlisten, indem man nach jeder JavaScript-Anweisung 256(?) Leerzeichen sendet.
Ajax-Test-Skript 2 (ohne Ajax, läuft unter Mozilla und dem IE)
(ACHTUNG: Auf dem Server ist nun Deflate eingeschaltet, sodass flush() in PHP nicht mehr funktioniert - es wird nur das Endergebnis angezeigt!!)
Ausgabe des Kontrollskripts (im Browser als Quelltext anschauen!)
Copyright © 2006 by Tobias Wiersch, 3D4X



Seite zuletzt geändert am: 15.11.2011