javascript - 开始多次下载并在出现下载提示窗口时获得反馈

标签 javascript html iframe download

我目前正在编写一个生成 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 .

如果只是为了确保下载已经开始,您可以在后端实现触发器以记录文件何时被访问。在最简单的形式中,它看起来像:

  1. 页面 download.html 请求 file.php?location=[...]&randomHash=1234
  2. 一旦 file.php 实际加载,它将在内存或数据库中设置一个标志,表明 randomHash id 1234 已启动。<
  3. file.php 将带有 302 header 的页面重定向到实际文件位置。
  4. download.html 使用 Ajax 定期检查标志 randomHash=1234 是否已被引发。如果是这样,它就知道下载已经开始。

关于javascript - 开始多次下载并在出现下载提示窗口时获得反馈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30437165/

相关文章:

javascript - jquery元素无法滑过iframe

javascript - 如何使用 iframe-resizer 更改 GAS iframe(在 WordPress 中)的高度

javascript - 奇怪的 Javascript 出现在静态 html 网页上

javascript - 将 Canvas 绘图录制为动画 .GIF

javascript - 如何编写 jQuery/JS 函数以使其返回值?

javascript - 将特定表单输入传递给 Jquery 函数

html - 带有子导航问题的水平导航

html - 如何在不指定尺寸的情况下使 iframe 适合整个屏幕?

javascript - 通过两个服务连接一个 promise

javascript - html中的可最小化侧面板