检测何时关闭“文件下载”弹出窗口

IT技术 javascript internet-explorer download
2021-02-28 18:30:36

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

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

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

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

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

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

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

5个回答

我不得不在另一个项目上处理此类问题。我终于找到了一个聪明的解决方案,如另一个Stackoverflow 问题中所述

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

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

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

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

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

听起来不错,但在我的情况下,iframe 加载事件未触发,可能是因为它仅在内容为 HTML 时触发。
2021-04-24 18:30:36
@blueish:普通的 ol<iframe onload=... >作品。或者:myiframe.onload=...使用一个lib附加的事件(比如通过addEventListener('load')),并没有工作IIRC。
2021-04-30 18:30:36
遗憾的是,iframe在文件下载时不会触发任何事件。
2021-05-03 18:30:36
正是我要找的。我已经有了 iframe 的模态对话框,但我试图将事件绑定到 iframe 中加载页面的文档加载......这不起作用。您的解决方案有效。谢谢!
2021-05-08 18:30:36
  • 打开您的等待弹出窗口
  • 执行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;
});
你救了我的命!
2021-04-17 18:30:36

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

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

在我们的应用程序中,我们遵循了以下方法。我们已经有一个基于 Cometd 的通知推送机制(您可以在此处阅读有关Cometd 的更多信息:什么是 Cometd?为什么使用它以及如何使用它),但我想您也可以使用 WebSockets 或类似的东西。我们在后端使用 Java,但它可以是任何东西。所以:

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