XHTMLforum

XHTMLforum (http://xhtmlforum.de/index.php)
-   Javascript & Ajax (http://xhtmlforum.de/forumdisplay.php?f=83)
-   -   Ajax ReadyState 3 (http://xhtmlforum.de/showthread.php?t=43240)

kevink 01.12.2006 23:37

Ajax ReadyState 3
 
Hi,

Ich hab heute angefangen Ajax zu lernen, da mich Ajax einfach fasziniert!
Zum erstenmal bin Ich mit Ajax bei Google-Mail zusammengestoßen, und da dachte Ich mir sofort "dass muss Ich lernen".
Nach ein paar Googlesuchen hab Ich dann auch schon aufgehört weiterdanach zu suchen, da es auf einen Schlag "so viel" war.

Naja, nach 2 Monaten hab Ich mich wieder rangesetzt (heute :)) und nun hab Ich mein erstes Ajax Script geschrieben, das mir nur durch Eingabe von Buchstaben sofort die dazugehörigen Suchergebnisse von Google ausspuckt ;).

Der Grundstein fürs weitere lernen ist nun gesetzt, nur mit einem komme Ich noch gar nicht klar: readyState 3.

readyState 4 ist soweit klar, die Daten werden angezeigt wenn die Datei fertig ist zu laden.

readyState 3 ist eigentlich auch klar, die Daten werden sofort übertragen, wenn der Server ein "push" sendet, was z.b. unter PHP flush() entsprechen würde.

Die Ausgabe funktioniert soweit auch, aber wie schaffe Ich es, zusätzliche Daten, wie z.b. einen Status - _neben_ der eigentlichen Rückgabe der Datei zu übergeben?

Z.b.:
Das Script "listmp3s.php" zeigt alle Mp3´s in einem Ordner an.
Nach jedem MP3-Dateinamen folgt ein flush(), um dies direkt an den Clienten zu übertragen.
Nun möchte Ich neben der Dateiliste, noch einen Status haben, der mir z.b. anzeigt, wieviel Prozent der MP3´s bereits ausgelesen wurden.

Wie mache Ich das? Brauche Ich dort einen extra XML Request?

Was Ich alles mit readyState 3 machen könnte! Aber ich bekomme das einfach nicht hin :-/.

Danke mal im Vorraus :).

Gruß Kevin

molily 07.12.2006 13:46

Zitat:

Zitat von kevink (Beitrag 316286)
readyState 3 ist eigentlich auch klar, die Daten werden sofort übertragen, wenn der Server ein "push" sendet, was z.b. unter PHP flush() entsprechen würde.

Der Server sendet keinen »Push«, sondern er sendet einfach. readyState 3 heißt erst einmal, dass der Server gerade Daten sendet und der Browser einfach zuhört und wartet. flush() macht nichts besonderes, sondern sendet einfach die Daten im Puffer.

Im Opera und Konqueror wird z.B. nur ein readyState-Event gefeuert, im Firefox viele hintereinander. Im Firefox kannst du folgendermaßen vorgehen: Beim ersten Event mit readyState gleich 3 fragst du über getResponseHeader den HTTP-Header »Content-Length« ab. Darin steht, wenn es sich um eine statische Datei auf dem Server handelt, die gesamte Dateigröße in Bytes. Gleichzeitig kannst du mit .responseText.length die bereits übertragenen Bytes (bzw. Zeichen) abfragen. Daraus lässt sich ein Prozentwert errechnen.

Zitat:

Die Ausgabe funktioniert soweit auch, aber wie schaffe Ich es, zusätzliche Daten, wie z.b. einen Status - _neben_ der eigentlichen Rückgabe der Datei zu übergeben?
»Nebenher« geht nicht, ich wüsste auch nicht, wie das mit einem parallelen Request funktionieren sollte. Woher weiß das serverseitige Script, ob der Client schon alles empfangen hat? Es übergibt nur Daten an den Apache zum Senden an den Client und beendet sich dann.

Zitat:

Das Script "listmp3s.php" zeigt alle Mp3´s in einem Ordner an.
Nach jedem MP3-Dateinamen folgt ein flush(), um dies direkt an den Clienten zu übertragen.
Nun möchte Ich neben der Dateiliste, noch einen Status haben, der mir z.b. anzeigt, wieviel Prozent der MP3´s bereits ausgelesen wurden.
Das würde wohl ziemlich umständlich. Du kannst am Anfang eine Zeile ausgeben, in der die Anzahl aller Dateien drinsteht. Und vor jeden Dateinamen eine Nummer schreiben. So kannst du bei einem readyState-3-Event die letzte Zeile von responseText auslesen und die bereits übertragenen Dateien auslesen. Ich würde daher mit Content-Length arbeiten, siehe oben.

schicker03 30.04.2007 17:19

Hi kevink,

ich denke das es so wie Du es Dir vorstellst sicher gar nicht klappt.

Wenn Du "listmp3s.php" aufrufst wird dein Browser zwar auf die Antwort des Scripts warten und vielleicht kannst Du mit flush und den ready states die aktuelle ausgabe abfangen, aber der Browser wird auf die fertige antwort warten, ehe er die Antwort einer 2ten Anfrage(request) darstellt.

nochmal kurz
solange die erste abfrage nicht fertig ist, kannst Du zwar hintenrum eine Menge Requests absetzen, die Antworten dieser requests werden aber erst vom Browser ausgewertet wenn das 1te (listmp3s.php) Script fertig ist.

Also kannst Du auch keinen Status damit abrufen/darstellen.

Man könnte das ganze anders lösen aber nicht sehr schön.
z.B. indem listmp3s.php gar keine Ausgabe macht sondern 2 Dateien erzeugt /bzw. Sie regelmäßig füllt und nur auf dem Server ausgeführt wird.
(z.B. mit exec oder system)

Die eine Datei mit der Ausgabe die Du per flush erreichen möchtest, also auch die spätere reine ausgabe
und
eine Datei mit einen Status Wert, z.B. 0.5 für 50%

Jetzt kannst Du aus dem Browser eine Datei aufrufen welche "listmp3s.php" auf dem Server lädt und 2 layer zurückgibt die Du regelmäßig füllst, eben einmal mit der Datei welche die Ausgabe enthält und aus der anderen Datei kannst Du eine Statusbalken zusammenbauen.

Wie gesagt keine schöne Lösung aber funktionert.
Hab gerade gesehen das der Post auch schon recht alt ist.

Wahrscheinlich hast Du schon eine bessere Lösung für das Problem gefunden xD

gruss
schicker03


Alle Zeitangaben in WEZ +2. Es ist jetzt 23:05 Uhr.

Powered by vBulletin® Version 3.8.11 (Deutsch)
Copyright ©2000 - 2024, vBulletin Solutions, Inc.

© Dirk H. 2003 - 2023