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 事件触发,span 的内容被替换,每个人的快乐的。

但是,如果 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 事件只触发一次。为 src 属性设置另一个值不会导致 onload 事件再次触发。

于 2009-10-07T05:58:00.300 回答
0

我有同样的问题,onLoad 处理程序仅在内容更改时触发。如果你下载一个文件。如果您删除 HTTP 标头以在 iframe 上打印文件内容,则 onload 会正确触发。

于 2009-12-02T10:49:32.007 回答
0

我的解决方案经过许多不同的方法来使其在 ff 即 safari 和 chrome 上工作后没有两步下载。

创建 iframe 的原始 JS 请求会加载一个通常会加载 pdf 的 src 但是,src 现在会加载一个页面,其中包含另一个 iframe,其中现在包含 pdf 的 url。在 html 响应中,我触发了 onload 以及一个包罗万象的 setTimeout 函数,它调用我对 window.parent.window.handlerfunction 的响应,我在顶部 iframe 上的 onload 本来就是。结果是一个 PDF 下载和一个跨浏览器工作的处理函数的顶级父级触发器,因为它不再依赖于检测实际的 iframe 加载,而是依赖于支持的父/子窗口关系。

希望这对也被卡住的人有所帮助

于 2013-02-21T18:49:39.897 回答
0

您可以在很短的时间间隔后重复检查 iframe readyState 属性,直到它完成。

function iframe_onload(iframe_id, js) {
    var iframe = document.getElementById(iframe_id);
    var iframeDoc = iframe.contentDocument || iframe.contentWindow.document;

    if (iframeDoc.readyState == 'complete') {
        eval(js)
        return;
    }

    window.setTimeout('iframe_onload("' + iframe_id + '",`' + js + '`);', 100);
}
于 2017-10-12T05:18:55.047 回答
-1

为此,您可能需要 jquery 的帮助,例如,您可以这样做:

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