web-dev-qa-db-ja.com

「ファイルのダウンロード」ポップアップが閉じられたことを検出する

一部のリンクでユーザーがPDFファイルを取得できる)Webページ(JSFで作成)があります。

ユーザーがそのようなリンクをクリックすると、待機中のポップアップ(モーダルパネル)が表示され(PDFの生成が長くなる可能性があるため)、ファイルが作成されると、= IEは、「開く」、「保存」、「キャンセル」オプションを提案する「ファイルのダウンロード」ポップアップを表示します。

このポップアップが閉じられたとき、つまりユーザーがPDFファイルを保存(または開いた)したとき)をWebページから知る方法はJavascriptにありますか?

もう少し正確に言うと、PDFファイルへのリンクを表示するWebページでは、ユーザーを待機させるためにモーダルポップアップ(「待機中のポップアップ」)が表示されます。 「ファイルのダウンロード」ポップアップ。問題は、ユーザーがPDFファイルを保存(または開く)すると、「ファイルのダウンロード」ポップアップは閉じますが、ユーザーは元のWebページに「戻る」ことです。 、待機中のポップアップが表示されたままです。

私のアプリケーションはIE6でのみ実行されるため、IE(6)のみのソリューションには反対していません...

JQueryを必要とするソリューションにも問題はありません;)

編集:「ファイルのダウンロード」ポップアップがユーザーに表示されたとき(つまり、ユーザーが保存、開く、またはキャンセルを選択する前)に発生するイベントをキャッチするソリューションが存在する場合、私も元気です!

20
Romain Linsolas

私はこの種の問題に別のプロジェクトで取り組む必要がありました。別の Stackoverflowの質問 で説明されているように、私はついにスマートな解決策を見つけました。

説明は次の投稿に記載されています: http://gruffcode.com/2010/10/28/detecting-the-file-download-dialog-in-the-browser

アイデアは、ファイルがいつダウンロードされるかを定義するために「単に」Cookieを使用することです。

15
Romain Linsolas

そのようなイベントは存在しません。これを解決するには、別のアプローチを取る必要があります。

  1. ダウンロードリンクを名前付きの非表示のiframeにターゲティングします(target="myhiddeniframe"
  2. ダウンロードリンクをクリックすると、読み込みスピナーが表示されます
  3. iframeのonload属性を、スピナーを非表示にするコールバックに設定します

正味の効果:PDFの生成中に「スピン」し、「ファイルのダウンロード」ダイアログが表示されたときに「スピンを解除」します(「ファイルのダウンロード」ダイアログが閉じたの場合とは対照的です)。

10
Crescent Fresh

ブラウザへの何らかのActiveXプラグインを検討したい場合を除いて、答えはノーであると確信しています(その場合、答えはまだノーである可能性があります...)

1
Richard Everett
  • 待機中のポップアップを開く
  • do ファイルを生成するためのAJAXクエリ生成されたファイルへの直接URLのみを返します。
  • コールバックで、待機中のポップアップを閉じて次にそのURLにリダイレクトします

例:

$('.generate_file_asynchronously').click(function(){
    var url = $(this).attr('href');

    show_loading_message();

    $.get(url, function(file_url) {
        hide_loading_message();
        window.location.href = file_url;
    });

    return false;
});
1
Jerome Jaglale

私がここで読んだすべての回答と、stackoverflowや他の場所での関連する質問では、問題の最初の部分、つまりサーバーがファイルを準備するのにかかる時間しか解決していません。問題の2番目の部分、つまりファイルが実際にクライアントにダウンロードを完了するのにかかる時間は、それほど簡単ではありません。

このアプリケーションでは、次のアプローチに従いました。すでにcometdに基づく通知プッシュメカニズムがあります(cometdの詳細についてはこちらをご覧ください: Cometdとは何ですか?なぜそれが使用されるのか、その作業方法 )が、WebSocketも使用できると思いますまたは同様のもの。バックエンドではJavaを使用しますが、何でもかまいません。

  1. クライアントはダウンロードを開始し、ユーザーIDと、アプリケーションおよびダウンロード固有のその他の一意の値を含むフラグ/トークンを送信します。ダウンロードボタンを非表示にします。
  2. サーバーはリクエストを受信し、ダウンロード用にファイルを準備してレスポンスを開始し、他のソリューションで説明されているように適切なヘッダーを設定します(Cookieの使用など)。
  3. クライアントは応答を受信しますが、ボタンは表示されません。サーバーがファイルを正常に作成し、ダウンロードが開始されたことを認識しているだけです。
  4. サーバーは、ダウンロードが実際にいつ終了するかを認識しています(ここで説明するように、ファイルを出力にストリーミングするループ内にあるため: https://stackoverflow.com/a/2343483/13412 )。サーバーは、ファイルのダウンロードが終了したことを認識すると、cometdを使用して、手順1のトークンを使用してクライアントに通知をプッシュします。
  5. クライアントはダウンロードが終了したという通知を受け取り、ボタンを再度表示します。
0
AsGoodAsItGets