Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在iframe中下载文件时如何触发onload事件?_Iframe_Onload_Download - Fatal编程技术网

在iframe中下载文件时如何触发onload事件?

在iframe中下载文件时如何触发onload事件?,iframe,onload,download,Iframe,Onload,Download,假设我们有以下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 = "

假设我们有以下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下载
var init=0;
函数下载(){
document.getElementById(“dload_frame”).src=”http://example.com/dload.py";
}
函数警报(){
if(init==0){
init=1;
}
否则{
document.getElementById(“alert_span”).innerHTML=“明白了!”;
}
}
主要内容。
现在,如果iframe的src被重写到的URL(在本例中为-“”)返回HTML,那么没有问题:onload事件触发,span的内容被替换,每个人都很高兴

但是,如果URL返回的文件的内容类型设置为强制浏览器打开“保存文件”对话框,则iframe的onload事件永远不会触发


有什么解决办法吗?无需使用iFrame,理想的行为是在浏览器开始下载提供的文件后启动回调。

您可能需要jquery的帮助,例如,您可以执行以下操作:

$.get('http://example.com/dload.py',{},function(result){
   $('alert_span').html(result);//or some content
});

我遇到了与此相同的问题: 这是我的作品,请看看是否适合你:

<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>

函数下载(){
var url='1〕http://example.com/dload.py';
var htm='';
document.getElementById('frameDiv')。innerHTML=htm;
}
下载文件
据我记忆所及,iframe的onload事件只触发一次。
为src属性设置另一个值不会导致onload事件再次激发。

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

我的解决方案采用了多种不同的方法使其在ff ie safari和chrome上运行,但没有两步下载

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


希望这能帮助那些同样陷入困境的人

您可以在短时间间隔后反复检查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);
}

不,这行不通。异步调用将返回的值保存到结果变量中,并将其传递给回调函数,而不是打开保存对话框。非常聪明!非常感谢。它在Chrome中不起作用,但至少在Firefox中起作用,而且可以多次起作用,因为每次它实际上都是一个新的iframe触发onload事件,因为你覆盖了innerHTML。我很高兴它对你起作用,但我还没有在Chrome上测试过它。这似乎对我遇到的一个类似问题起作用——只要Firebug还在运行。当我在没有Firebug的Firefox2或Firefox3中尝试时,onload突然无法启动。有人知道区别在哪里吗?在Chrome中不起作用:我如何删除HTTP头并能够在web浏览器中下载文件?您可以尝试使用ajax获取文件,然后创建一个带有数据URI的标记(链接),然后单击它,但我没有用大文件测试它。我下载了php base,在第一次刷新之后,数据被发送到浏览器,即使下载仍在进行,状态也被标记为完成。显然,这会检测外部iframe HTML何时加载。它实际上没有检测到PDF文件下载。(虽然我想它确实给了您检查请求的PDF是否存在的选项,在外部iframe的服务器端脚本中)。