问题描述
我立即创建一个 iframe,并将 URL 设置为一个下载二进制文件 (xls,doc …) 的页面。当文件正在下载时,我会显示一个动画。什么时候没有,我隐藏它。
问题是,Chrome 不知道文件何时完全下载,即 iframe 完全加载。我使用 iframe 属性 readyState
来检查 iframe 的状态:
var iframe = document.createElement("iframe");
iframe.style.visibility = "hidden";
// I start a progress animation
window.setTimeout(showProgressAnimation, 1000);
// I start the file download
iframe.src ='GetFile.aspx?file=' + fileName;
document.body.appendChild(iframe);
function showProgressAnimation() {
if (iframe.readyState == "complete" || iframe.readyState == "interactive") {
// I stop the animation and show the page
animation.style.display = 'none';
progressBar.hide();
$('#page').show();
}
else {
// Chrome is always getting into this line
window.setTimeout(showProgressAnimation, 1000);
}
}
所以结果是一个无限循环。
我已经尝试了以下内容,它可以在 Firefox 和 Chrome 中运行,但是当内容是二进制文件时却不行:
if ($.browser.mozilla || $.browser.webkit ) {
iframe.onload = function showProgressAnimation() {
animation.style.display = 'none';
progressBar.hide();
$('#page').show();
}
}
// IE
else{
window.setTimeout(showProgressAnimation, 1000);
}
最佳解决办法
您可以使用 onload
来表示 iframe
的负载
这里是一个简单的例子,工作
var iframe = document.createElement("iframe");
iframe.style.display = "none";
// this function will called when the iframe loaded
iframe.onload = function (){
iframe.style.display = "block";
alert("loaded");
};
// set the src last.
iframe.src ='http://www.test.com';
// add it to the page.
document.getElementById("one").appendChild(iframe);
测试在这里:http://jsfiddle.net/48MQW/5/最后加载 src
。 http://jsfiddle.net/48MQW/24/
次佳解决办法
请尝试这个 – 你真的是混合 dom 和 jQuery 从一行到另一行
var tId;
function stopAnim() {
// I stop the animation and show the page
animation.hide();
progressBar.hide();
$('#page').show();
clearInterval(tId);
}
var iframe = $("<iframe />");
iframe.css("visibility","hidden");
iframe.on("readystatechange",function() {
if (this.readyState == "complete" || this.readyState == "interactive") {
stopAnim();
}
});
iframe.on("load",function() { // can possibly be deleted
if (tId) {
stopAnim();
}
});
iframe.attr("src","GetFile.aspx?file=" + fileName);
$("body").append(iframe);
tId = setInterval(function() {
// update progress here
}, 1000); //
第三种解决办法
可下载的文件内容不会触发 readystatechange 事件处理程序或 onload 事件处理程序。这个 couse 你可以在服务器端设置一个 cookie 文件内容,客户端定期检查这个 cookie 。例如:
服务器
response.cookie('fileDownloaded','true');
response.header('attachment','your-file-name.any');
//...write bytes to response...
客户
var checker = setInterval(()=>{
if(document.cookie.indexOf('fileDownloaded')>-1){
alert('done');
clearInterval(checker);
}
},100);
当然,您可以使用框架来正确检查 cookie 值,这只是一个 poc,而不是一个安全的 cookie 解析器。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。