それは簡単ではありません。 ajax呼び出しが処理を開始すると、チャンク/マルチパート応答を行うことができます(ほとんどのdhtmlチャットが実装されている方法です)。 "COMET"のgoogle
基本的にはそのように動作します:
- クライアント:AJAXコール実行時間の長いアクションの開始を要求
- サーバー:(スクリプトの終了なし)、実行時間の長いアクションを開始
echo
0%、flush();
- クライアント:フラッシュされたコンテンツ(特別なコールバック)で応答を受信し、値を表示しますが、接続は開いたままです!
- サーバー:Xアクションの後
echo
とflush();
- クライアント、割合を計算:第3位
- サーバーを参照してください。スクリプトの終わりのための通常のイベント/コールバック:スクリプトが完了した場合、
- クライアントを終了します。(まだ新しかったJavaScriptの非同期は!と)少しデモをコード化されたディスプレイが100%、開いて次のページ
私一度...それは故人となったビットは今ですが、非同期部分がまだ動作します。あなたはここでそれを見つけることができます:
<?php
$c = $_GET[ 'c' ];
header('Content-type: multipart/x-mixed-replace;boundary="rn9012"');
sleep(1);
print "--rn9012\n";
print "Content-type: application/xml\n\n";
print "<?xml version='1.0'?>\n";
print "<content>Multipart: First Part of Request " . $c . "</content>\n";
print "--rn9012\n";
flush();
sleep(3);
print "Content-type: application/xml\n\n";
print "<?xml version='1.0'?>\n";
print "<content>Multipart: Second Part of Request " . $c . "</content>\n";
print "--rn9012--\n";
?>
ことが可能方向にナッジよりも何もない:http://wehrlos.strain.at/httpreq/client.html
はjavascriptのクライアント側のコードは、
function asSendSyncMulti() {
var httpReq = new XMLHttpRequest();
showMessage('Sending Sync Multipart ' + (++this.reqCount) );
// Sync - wait until data arrives
httpReq.multipart = true;
httpReq.open('GET', 'server.php?multipart=true&c=' + (this.reqCount), false);
httpReq.onload = showReq;
httpReq.send(null);
}
function showReq(event) {
if (event.target.readyState == 4) {
showMessage('Data arrives: ' + event.target.responseText);
}
else {
alert('an error occured: ' + event.target.readyState);
}
}
マルチパートのためのサーバーサイドPHPコードを使用しました。 HTMLに準拠していないか、クロスブラウザーではありません。 xmlの代わりにjsonを使用します。
サーバー側では、出力キャッシュ(圧縮など)をオフにする必要があります。そうしないと、flush();
は何も行いません。 --rn9012
は、出力されたデータに決して出現しないものでなければなりません(進行状況を表示してもまだ表示されていない場合はunlikley)。