在iframe中下载文件时如何触发onload事件?
假设我们有以下HTML文件:在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 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的服务器端脚本中)。