5

次のユース ケースに対するクロスブラウザ ソリューションが必要です。ユーザーがページの 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」.

4

3 に答える 3

1

iframe ソリューションで、実際に親ウィンドウ内のメソッドを呼び出して、iframe の位置を設定しようとしましたか? 私のテストでうまくいったので、私は尋ねています:

親ウィンドウ

<html>
<head>
<script type="text/javascript">
var w;

var download = function() {
    document.frames[0].location = "test.php";
    w.close();
};

var o = function() {
    w = window.open("test2.html", "window_name");
    return false;
};
</script>
</head>
<body>

<a href="#" onclick="return o();">open</a>

<iframe></iframe>

</body>
</html>

ポップアップウィンドウ

<html>
<head>
<script type="text/javascript">
var download = function() {
    window.opener.download();
    return false;
};
</script>
</head>
<body>

<a href="#" onclick="return download();">download</a>

</body>
</html>

test.phpはファイルのダウンロードを強制するページにすぎません。上記のコードは document.frames オブジェクトを使用しているため、IE 固有のものですが、クロスブラウザーで簡単に作成できることに注意してください。

于 2009-05-07T14:50:10.780 に答える
0

これは、問題にアプローチするための方法かもしれません。

1) ポップアップ フォーム onsubmit は、window.open を 3 番目のウィンドウに実行します。このウィンドウは、ダウンロードしたファイルを返すだけの空白ページであるページを開きます。

2) ポップアップ フォームの JavaScript で、window.open を実行した直後に、ポップアップ送信フォームを閉じる親ウィンドウ (最初のウィンドウ) メソッドを呼び出します。

3) 3 番目のページ (ファイルを返すページにすぎません) では、ヘッダー ファイルの content-disposition で、ファイルだけを返すだけで他には何も返さないため、ページは実際には開きません。

必要なヘッダーに関する情報を次に示します。コードは古典的な先史時代の ASP ですが、必要なものを理解できるはずです。

http://classicasp.aspfaq.com/general/how-do-i-prompt-a-save-as-dialog-for-an-accepted-mime-type.html

それが役立つことを願っています。

于 2009-05-07T14:09:36.633 に答える