次のユース ケースに対するクロスブラウザ ソリューションが必要です。ユーザーがページの 1 つで「エクスポート」ボタンをクリックすると、フォームのポップアップが開きます。フォームを送信すると、ユーザーはバイナリ ファイルのダウンロード (CSV ファイルなど) を受け取り、親ウィンドウの表示内容を変更せずにポップアップを閉じる必要があります。
タイムアウトを使用してポップアップを閉じることはできません。これは、通常、ファイルをダウンロードする前にファイルの処理方法をユーザーに尋ねるダイアログがあり、ユーザーがこのダイアログを処理するのにかかる時間を知る方法がないためです。
元々、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 が含まれます。ファイル名=ファイル名.csv」.