13

次の HTML ファイルがあるとします。

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Test iframe download</title>
<script type="text/javascript">

var init = 0;

function download() {
  document.getElementById("dload_frame").src = "http://example.com/dload.py";
}

function alert() {
  if (init == 0) {
    init = 1;
  }
  else {
    document.getElementById("alert_span").innerHTML = "Got it!";
  }
}

</script>
</head>
<body>

  <span id="alert_span">Main content.</span><br/>
  <input type="button" value="Download" id="btn" onclick="download()" />
  <iframe id="dload_frame" src="http://404.com/404" onload="alert()"> </iframe>

</body>
</html>

ここで、iframe の src が書き換えられる URL (この場合は " http://example.com/dload.py ") が HTML を返す場合、問題はありません: onload イベントが発生し、スパンのコンテンツが置き換えられ、全員のハッピー。

ただし、URL によって返されるファイルのコンテンツ タイプが、ブラウザーにファイルの保存ダイアログを開くように強制するものに設定されている場合、iframe の onload イベントは決して発生しません。

回避策はありますか?iframe を使用する必要はありません。望ましい動作は、ブラウザーが提供されたファイルのダウンロードを開始した後にコールバックを起動することです。

4

5 に答える 5

1

これと同じ問題に遭遇しました: これが私の回避策です。うまくいくかどうかを確認してください:

<script>
 function download(){
    var url = 'http://example.com/dload.py';
    var htm = '<iframe src="' + url +'" onload="downloadComplete()"></iframe>';
    document.getElementById('frameDiv').innerHTML = htm;
 }
</script>

<div style="display:none" id="frameDiv">
</div>
<button onclick="download()">download file</button>

私が覚えている限り、iframe の onload イベントは 1 回だけ発生します。src 属性に別の値を設定しても、onload イベントが再度発生することはありません。

于 2009-10-07T05:58:00.300 に答える
0

私は同じ問題を抱えています.onLoadハンドラーはコンテンツが変更されたときにのみ起動します. ファイルをダウンロードする場合。HTTP ヘッダーを削除してファイル コンテンツを iframe に出力すると、onload が正しく起動します。

于 2009-12-02T10:49:32.007 に答える
0

これをff、つまりサファリとクロムで機能させるためのさまざまなアプローチの後の私の解決策には、2段階のダウンロードがありませんでした。

iframe を作成する元の JS リクエストは、通常は pdf をロードする src をロードしますが、src は、pdf の URL を含むさらに別の iframe を含むページをロードするようになりました。HTML応答では、onloadと、上部のiframeでのonloadがあったはずのwindow.parent.window.handlerfunctionで応答を呼び出すcatchall setTimeout関数をトリガーします。その結果、PDF のダウンロードと、ハンドラー関数の最上位の親でのトリガーが実現します。これは、実際の iframe の読み込みの検出に依存するのではなく、サポートされている親/子ウィンドウの関係に依存するため、ブラウザー全体で機能します。

これが立ち往生していた人に役立つことを願っています

于 2013-02-21T18:49:39.897 に答える
-1

これには jquery の助けが必要な場合があります。たとえば、次のことができます。

$.get('http://example.com/dload.py',{},function(result){
   $('alert_span').html(result);//or some content
});
于 2009-10-06T10:04:09.077 に答える