我目前正在编写一个生成 html 文件并使用默认浏览器打开它以开始多次下载的小程序。
我不想为每次下载打开一个选项卡/窗口,因此为下载创建隐藏的 iframe 似乎是一个很好的解决方案。
我在 iframe 上使用 onload
来查明每次下载的下载提示是否已经出现。不过,这种方法在 Internet Explorer 中似乎非常不可靠。
所以我想知道是否有解决此问题的方法或者更好的方法?
(请不要使用库。)
这是我的 html/js 代码:
<!DOCTYPE html>
<!-- saved from url=(0016)http://localhost -->
<html><head>
<meta content="text/html;charset=utf-8" http-equiv="Content-Type">
<meta content="utf-8" http-equiv="encoding">
<title>Downloads</title>
<script>
"use strict";
var downloadsInfo = {
"http://download-installer.cdn.mozilla.net/pub/firefox/releases/26.0/win32/en-US/Firefox%20Setup%2026.0.exe":"Status: Connecting",
"http://download.piriform.com/ccsetup410.exe":"Status: Connecting"
};
var i = 0;
var iv = setInterval(function() {
i = ++i % 4;
var j = 0;
var finished = true;
for (var key in downloadsInfo) {
var value = downloadsInfo[key];
if (value != "Status: Download Started!") {
value = value+Array(i+1).join(".");
finished = false;
}
document.getElementsByTagName("div")[j].innerHTML = key+"<br/>"+value;
j = j+1;
}
if (finished) {
alert('Done! You can close this window/tab now.');
clearInterval(iv);
}
}, 800);
</script>
</head><body>
<h3>Please wait for your downloads to start and do not reload this site.</h3>
<div></div> <br/><br/>
<div></div> <br/><br/>
<iframe src="http://download-installer.cdn.mozilla.net/pub/firefox/releases/26.0/win32/en-US/Firefox%20Setup%2026.0.exe" onload="downloadsInfo['http://download-installer.cdn.mozilla.net/pub/firefox/releases/26.0/win32/en-US/Firefox%20Setup%2026.0.exe'] = 'Status: Download Started!';" style="display:none"></iframe>
<iframe src="http://download.piriform.com/ccsetup410.exe" onload="downloadsInfo['http://download.piriform.com/ccsetup410.exe'] = 'Status: Download Started!';" style="display:none"></iframe>
</body></html>
最佳答案
很简单,您无法知道 native 浏览器下载是否已开始。每个浏览器都有不同的处理方式,用户可以设置他的浏览器来提示位置,或者他可能只是让它自动下载到 Downloads
文件夹(现在大多数浏览器的默认设置)。如果他提示输入位置,他可能会错误地取消,但您的设置仍会要求下载开始。所以,不,没有任何方法可以可靠地通知用户他们可以在所有下载开始/完成后关闭选项卡......前提是您使用 native 浏览器下载机制。
实现此效果的方法可能是首先使用 Javascript 下载文件(要求您有权访问这些文件,热链接到第三方文件当然不是一个选项)。实际操作 try downloading a file from mega.nz .我正计划写下如何手动执行此操作,但是 there is already a nice (quite outdated) answer outlining this .
如果只是为了确保下载已经开始,您可以在后端实现触发器以记录文件何时被访问。在最简单的形式中,它看起来像:
- 页面
download.html
请求file.php?location=[...]&randomHash=1234
- 一旦
file.php
实际加载,它将在内存或数据库中设置一个标志,表明randomHash
id1234
已启动。< file.php
将带有302
header 的页面重定向到实际文件位置。download.html
使用 Ajax 定期检查标志randomHash=1234
是否已被引发。如果是这样,它就知道下载已经开始。
关于javascript - 开始多次下载并在出现下载提示窗口时获得反馈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30437165/