ファイルがブラウザに提供されたかどうかを検出していますか?
-
05-07-2019 - |
質問
window.location を PHP ファイルに設定するボタンがあり、フィードを生成してダウンロードされます。ただし、フィードに入力されるデータによってファイルのサイズが異なるため、ボタンをクリックしてからファイル ダイアログが表示されるまでに時間がかかる場合があります。
私ができるようにしたいのは、ボタンをクリックして、ダイアログ/ファイルが完了するまでloading.gifを表示することです。
どのアイデアも素敵です!
乾杯
解決
RSS生成スクリプトに必要な画像を表示するだけです(画像のHTMLを出力してから、出力バッファをフラッシュしてデータ生成を開始します)。データ生成の最後に以下を実行します。
<?php
print '<script>window.location = "http://www.newlocation.com"</script>'
それだけです。
他のヒント
なぜファイルのサイズを確認する必要があるのかよくわかりません。ajax を使用して get/post を動的に実行し、その実行中に読み込みアイコンを表示しようとしているだけの場合、非同期アクティビティ インジケーターをスローするのは非常に簡単です。たとえば、jQuery の場合:
$("#loading").ajaxStart(function(){
$(this).show();
});
$("#loading").ajaxStop(function(){
$(this).hide();
});
$("#feeds").load("feeds.php?id=89734258972347895");
上記のコードは、非同期リクエストが開始および停止されたときに表示および非表示になるように、ID が「loading」の DOM オブジェクトを設定します。.load(url) は、URL のコンテンツを div #feeds にロードします。content-disposition を設定している場合:添付ファイルヘッダーを PHP で編集すると、ファイルが div に非同期でロードされた場合でも、ファイルのダウンロード ウィンドウが自動的に開始されます。もちろん、これは jquery を使用しなくても可能です。ブラウザ互換性のある JavaScript が大量に存在するだけで、ajaxStart イベントと ajaxStop イベントをサブスクライブして読み込み中の画像を表示または非表示にするほど簡単ではありません。
ジョシュ
window.locationを設定する前に、gifで非表示のdivを表示できます
旧式ですが、サーバープッシュを使用すると非常に簡単に実行できます
<?php
$separator = "end_of_section_marker";
header('Content-type: multipart/x-mixed-replace;boundary=$separator');
print "\n--$separator\n";
print "Content-type: text/html\n\n";
// Send placeholder message here
print "--$separator\n";
ob_flush();
flush();
// Start long processing here
print "Content-type: text/html\n\n";
// send data here
print "--$separator--\n";
?>
送信するデータのコンテンツタイプを調整するだけです。 $ separatorは、送信されるデータに表示されない限り、任意の値にできます。
過去に使用した方法は次のように動作します...
- window.locationを読み込みページに設定し、クエリ文字列で宛先ページを渡します。読み込みページには、アニメーションgifまたは処理が行われていることを示すために好きなものを表示する必要があります。ロードページは、クエリ文字列で渡された宛先ページに(他の適用可能なクエリ文字列パラメータとともに)すぐにリダイレクトする必要があります。
EDIT:ロードページは、javascriptを使用して宛先ページにリダイレクトする必要があります(window.locationをクエリ文字列で指定されたURLに設定します)。サーバー側でリダイレクトした場合、読み込みページは表示されないため、これは重要なポイントです。
編集2:読み込みページがphpファイルの場合、ダウンロードするファイルのサイズを確認し、ユーザーに推定ダウンロード時間を表示することができます(アニメーションの「読み込み」gifとともに)かどうかなど。
- 宛先ページは、バッファリングを有効にしてレンダリングする必要があります(コンテンツをレンダリングする前にob_start()を呼び出します)。バッファリングを有効にすると、ページ全体がレンダリングされるまで、ブラウザには何も送信されません。その間、手順1の読み込みページは引き続き表示されます。
ダウンロードするファイルの正確なサイズを検出するには、AJAXを使用してサーバーと通信する必要があります。次に、テストするものがあります。クライアント側からのみ予想されるペイロードのサイズを知る方法はありません。
iframeを使用してフィードをロードし、間隔を使用してiframe /ドキュメントのreadyStateを確認することは可能ですか?したがって、プロセスは次のようになります。
- 幅と高さ100%のiframeと、iframe上のloading.gifを含むウィンドウを読み込みます。
- iframe.contentWindow.document.readyStateプロパティのタイマーチェックを設定します
- readyState ==完了したら、ファイルの保存ダイアログを表示します。
欠点は、ほとんどのブラウザでは、PHPファイルが同じドメインにある必要があることです(IEでは、iframeのreadyStateプロパティを確認するだけです)。