【问题标题】:detecting when the "File download" popup is closed检测“文件下载”弹出窗口何时关闭
【发布时间】:2010-10-14 13:36:35
【问题描述】:

我有一个网页(使用 JSF 制作),其中一些链接允许用户获取 PDF 文件。

当用户点击这样的链接时,会显示一个等待弹窗(它是一个模态面板)(因为PDF的生成可能会很长),并且一旦创建文件,IE就会显示“文件下载”建议“打开”、“保存”和“取消”选项的弹出窗口。

当此弹出窗口关闭时,即用户保存(或打开)PDF 文件时,Javascript 是否可以从我的网页中获知?

更准确地说,在显示 PDF 文件链接的网页中,会显示一个模式弹出窗口(“等待弹出窗口”),以使用户等待“文件下载”弹出窗口。问题是当用户保存(或打开)PDF文件时,“文件下载”弹出窗口关闭,但用户随后“返回”到原始网页,仍然显示等待弹出窗口。

请注意,我的应用程序仅在 IE6 中运行,因此我不反对仅 IE(6) 的解决方案...

我对需要 jQuery 的解决方案也没有任何问题 ;)

编辑: 如果存在一种解决方案来捕捉在“文件下载”弹出窗口显示给用户时(即在用户选择保存、打开或取消之前)触发的任何事件,那么对我来说也可以!

【问题讨论】:

    标签: javascript internet-explorer download


    【解决方案1】:

    我很确定答案是否定的,除非您想考虑为浏览器添加某种 ActiveX 插件(在这种情况下,答案可能仍然是否定的......)

    【讨论】:

      【解决方案2】:

      不存在这样的事件。你需要采取不同的方法来解决这个问题。

      1. 将下载链接定位到具有名称 (target="myhiddeniframe") 的隐藏 iframe
      2. 点击下载链接,显示您的加载微调器
      3. 将 iframe 的 onload 属性设置为隐藏微调器的回调

      实际效果:您在生成 pdf 时“旋转”,而在“文件下载”对话框出现时“取消旋转”(与“文件下载”对话框关闭时相反)。

      【讨论】:

      • 正是我想要的。我已经有了 iframe 的模态对话框,但我试图将一个事件绑定到 iframe 中加载页面的文档加载......这不起作用。您的解决方案有效。谢谢!
      • 听起来不错,但在我的情况下没有触发 iframe 加载事件,可能是因为它仅在内容为 HTML 时才会触发。
      • @bluish:普通的 ol <iframe onload=... > 有效。或者:myiframe.onload=...。使用库附加事件(例如,通过addEventListener('load'))确实工作IIRC。
      • 遗憾的是,iframe 在文件下载时不会触发 any 事件。
      【解决方案3】:

      我不得不在另一个项目上解决这类问题。我终于找到了一个聪明的解决方案,正如另一个 Stackoverflow question 中所解释的那样。

      解释在下面的帖子中给出:http://gruffcode.com/2010/10/28/detecting-the-file-download-dialog-in-the-browser

      这个想法是“简单地”使用 cookie 来定义何时下载文件。

      【讨论】:

        【解决方案4】:

        我在此处以及有关 stackoverflow 和其他地方的相关问题中阅读的所有答案仅解决了问题的第一部分,即服务器准备文件所需的时间。问题的第二部分,即文件在客户端实际完成下载所需的时间,并不是那么微不足道。

        在我们的应用程序中,我们遵循以下方法。我们已经有了一个基于 cometd 的通知推送机制(你可以在这里阅读更多关于 cometd 的信息:What is Cometd ? Why it is used and how to work on that),但我想你也可以使用 WebSockets 或类似的东西。我们在后端使用 Java,但它可以是任何东西。所以:

        1. 客户端启动下载,发送一个标志/令牌,其中包含用户 ID 和其他一些特定于应用程序和下载的唯一值。它隐藏了下载按钮。
        2. 服务器接收请求,准备下载文件并启动响应,设置适当的标头,如其他解决方案中所述(例如使用 cookie)。
        3. 客户端收到响应,但没有显示按钮,它只知道服务器已成功创建文件并开始下载。
        4. 服务器知道下载何时真正完成(因为它在循环中将文件流式传输到输出,如下所述:https://stackoverflow.com/a/2343483/134120)。当服务器知道文件已完成下载时,它会使用 cometd 使用步骤 1 中的令牌向客户端推送通知。
        5. 客户端收到下载完成的通知并再次显示按钮。

        【讨论】:

          【解决方案5】:
          • 打开等待弹出窗口
          • 执行AJAX 查询以生成文件,返回该文件的 URL
          • 在 AJAX 查询回调中,关闭等待的弹出窗口然后重定向到文件 URL

          例子:

          $('.generate_file_asynchronously').click(function(){
              var url = $(this).attr('href');
          
              show_loading_message();
          
              $.get(url, function(file_url) {
                  hide_loading_message();
                  window.location.href = file_url;
              });
          
              return false;
          });
          

          【讨论】:

          • 你救了我的命!
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多