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

时间:2009-03-20 14:51:45

标签: javascript internet-explorer download

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

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

当这个弹出窗口关闭时,即当用户保存(或打开)PDF文件时,Javascript是否有办法从我的网页知道?

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

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

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

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

5 个答案:

答案 0 :(得分:14)

我不得不在另一个项目上处理这类问题。我终于找到了一个智能解决方案,如另一个Stackoverflow question中所述。

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

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

答案 1 :(得分:10)

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

  1. 将下载链接定位到名称为target="myhiddeniframe"
  2. 的隐藏iframe
  3. 点击下载链接,显示您的加载微调器
  4. 将iframe的onload属性设置为隐藏您的微调器的回调
  5. 净效果:生成pdf时“旋转”,“文件下载”对话框出现时“取消固定”(与“文件下载”对话框关闭时相反)。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

  • 打开等待弹出窗口
  • 执行 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;
});

答案 4 :(得分:0)

我在这里阅读的所有答案以及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. 客户端会收到下载完成并再次显示该按钮的通知。