次のユースケースに対して、クロスブラウザソリューションが必要です。 ユーザーが私たちのページの「エクスポート」ボタンをクリックすると、フォームでポップアップが開きます。フォームを送信すると、ユーザーはバイナリファイルのダウンロード(たとえばCSVファイル)を受け取り、親ウィンドウの表示内容を変更せずにポップアップを閉じる必要があります。ポップアップで閉じる(IEとFirefoxで)バイナリファイルをダウンロードするには?
タイムアウトを使用してポップアップを閉じることはできません。通常、ファイルをダウンロードする前にユーザーにファイルを処理する方法を尋ねるダイアログがあります。このダイアログを処理する時間を知る方法はありません。
元は、ポップアップにwindow.locationをダウンロードファイルURLに設定するスクリプトがありました。そのため、ポップアップは閉じられません。
親ウィンドウに隠れたiFrameを置いて、ポップアップにiFrameのsrcをダウンロードURLに設定してからself.close()を呼び出すようにしました。それはFirefoxで完全に動作しますが、IEはセキュリティ制限で完全にそれを悪用します。
これを行う正しい方法はありますか? IEで動作する方法はどうですか?
アップデート - 問題は、ここで提案答えはあまりにも遠くありませんでしたが、私の問題だけでJavascriptの問題であることよりも少し複雑だった
を解決しました。 IEとExcelでバグが発生しました(ダウンロードファイルはCSVです)、ポップアップはフォームポストを行っていました。
フォームデータをURL(POSTではなくGET)に追加せずに問題を解決できず、IEで信頼できるサイトとして設定する必要があります(これはエンタープライズアプリケーションなので、合理的ですユーザーの作成要求)。
フォームボタンをクリックすると、ポップアップがwindow.openerの関数を呼び出し、フォームとそのアクションURLを渡します。次にポップアップはwindow.close()を呼び出します。この関数はフォームデータをURLに追加し、window.locationを新しいURLに設定します(iFrameのアイデアはIEではうまく機能せず、明らかに必要ではありませんでした)。
フォームURLへの応答では、要求ヘッダーにはContent-Type:application/octetstreamとContent-Disposition "、" attachment "が含まれます。ファイル名= filename.csv」。
オリジナルのページにフォームを置くか、新しいページをiframeで開きます(スクリプト自体から生成される可能性があります)。 – Anonymous
Anonymousへの返信 - あなたが何を記述しているかは、私がやったことのようなものだと思います。ポップアップは、作成および初期ロード時に、実際には目に見えないiFrameを親ページに書き込みます。フォームがポップアップで送信されると、ダウンロードファイルをロードするようにiFrameに指示します。私のIE(IE 6)はこれをブロックし、親ウィンドウでダウンロードを確認するように強制しました。確認時に、親ウィンドウフォームを再送信しようとします。これにより、もう1つの確認ダイアログが表示され、通常は上書きされます。 –
私はiframeにフォームを提出することを考えていました。これは、ポップアップ問題が解消されています。 – Anonymous