Client-Anfrage-Webseite vom Server. Clent fordert dann zusätzliche Berechnungen an; Der Server führt eine Reihe von Berechnungen durch und sendet Teilergebnisse, sobald diese verfügbar sind (Textformat, jede Zeile enthält einen separaten vollständigen Eintrag). Client aktualisiert die Webseite (mit JavaScript und DOM) unter Verwendung der vom Server bereitgestellten Informationen.Cross-Browser-Implementierung von "HTTP-Streaming" (Push) AJAX-Muster
Dies scheint zu passen HTTP Streaming (current Version) Muster von Ajaxpatterns Website.
Die Frage ist, wie man es browser-übergreifend (Browser-agnostisch) macht, vorzugsweise ohne JavaScript-Frameworks zu verwenden, oder ein leichtgewichtiges Framework wie jQuery zu verwenden.
Das Problem beginnt mit der Erstellung von XMLHttpRequest in Browser-übergreifender Weise, aber ich denke, das wichtigste Element ist, dass nicht alle Browser korrekt implementieren onreadystatechange
von XMLHttpRequest; nicht alle Browser rufen onreadystatechange
Ereignis auf jedem Server Flush (BTW. Wie erzwingen Server Flush aus dem CGI-Skript (in Perl)?). Beispielcode auf Ajaxpatterns behandelt dies mithilfe von Timer; sollte ich die Timer-Lösung abbrechen, wenn ich eine Teilantwort von onreadystatechange
feststelle?
Added 11-08-2009
Aktuelle Lösung:
ich die folgende Funktion verwenden XMLHttpRequest-Objekt zu erstellen:
function createRequestObject() {
var ro;
if (window.XMLHttpRequest) {
ro = new XMLHttpRequest();
} else {
ro = new ActiveXObject("Microsoft.XMLHTTP");
}
if (!ro)
debug("Couldn't start XMLHttpRequest object");
return ro;
}
Wenn ich verwenden waren einige (vorzugsweise leichte) JavaScript-Framework wie jQuery, würde ich gerne Fallback Benutzer haben wählt die Installation von jQuery aus.
Ich benutze den folgenden Code, um AJAX zu starten; setInterval
wird verwendet, weil einige Browsernur aufrufen, nachdem der Server die Verbindung beendet hat (was einige zehn Sekunden dauern kann) und nicht sobald der Server Daten löscht (etwa jede Sekunde oder öfter).
function startProcess(dataUrl) {
http = createRequestObject();
http.open('get', dataUrl);
http.onreadystatechange = handleResponse;
http.send(null);
pollTimer = setInterval(handleResponse, 1000);
}
Die handleResponse
Funktion ist sehr kompliziert, aber die Skizze es sieht wie folgt aus. Kann es besser gemacht werden? Wie würde es mit einem leichten JavaScript-Framework (wie jQuery) gemacht werden?
function handleResponse() {
if (http.readyState != 4 && http.readyState != 3)
return;
if (http.readyState == 3 && http.status != 200)
return;
if (http.readyState == 4 && http.status != 200) {
clearInterval(pollTimer);
inProgress = false;
}
// In konqueror http.responseText is sometimes null here...
if (http.responseText === null)
return;
while (prevDataLength != http.responseText.length) {
if (http.readyState == 4 && prevDataLength == http.responseText.length)
break;
prevDataLength = http.responseText.length;
var response = http.responseText.substring(nextLine);
var lines = response.split('\n');
nextLine = nextLine + response.lastIndexOf('\n') + 1;
if (response[response.length-1] != '\n')
lines.pop();
for (var i = 0; i < lines.length; i++) {
// ...
}
}
if (http.readyState == 4 && prevDataLength == http.responseText.length)
clearInterval(pollTimer);
inProgress = false;
}
Sie sollten dieses Codebeispiel unbedingt als Antwort hinzufügen und als richtig markieren! –
"wenn der Benutzer jQuery nicht installieren möchte"? – Basic
Hallo, ich bin gerade auf Ihre Lösung gestoßen, aber ich befürchte, dass es immer noch nicht mit dem IE funktioniert, denn wenn Sie versuchen, den responseText zu erhalten, während die Anfragen noch nicht beendet wurden, erhalten Sie Folgendes Meldung: "Die zur Durchführung dieses Vorgangs erforderlichen Daten sind noch nicht verfügbar". –