文件下载对话框何时打开? - HTML, Javascript

Posted

技术标签:

【中文标题】文件下载对话框何时打开? - HTML, Javascript【英文标题】:When Does the File Download Dialog Open? - HTML, Javascript 【发布时间】:2010-04-02 11:25:23 【问题描述】:

我有一个html页面,当我点击页面上的文件链接时,会弹出文件下载对话框,并且这个文件对话框会锁定页面。我的意思是如果不选择其中一个选项(打开、保存、取消),我无法在页面上执行任何操作(这很正常)。我需要的是javascript是否可以检查页面是否被锁定。 (或者是否弹出文件对话框?)

附言不要说“给链接添加 onclick 事件”,因为服务器可能会响应很慢(比如点击后 30 秒)

【问题讨论】:

“不要说“给链接添加 onclick 事件”,因为服务器可能会响应很慢(比如点击后 30 秒)” 服务器有关系吗?当您选择文件时,这都是客户端。在您提交表单之前,服务器不会参与其中。 其实我是在点击链接的时候提交了一个表单,表单的响应是一个文件,而不是html文档。 您的目标浏览器是什么?我在 IE、Firefox、Opera 和 Chrome 中进行了测试。 Chrome 是唯一一个“锁定”页面的。 对我来说在 FF 为什么要检查文件下载对话框是否打开?换句话说,如果你有一个解决方案,你会用它做什么? 【参考方案1】:

如果您知道您的服务器正在返回一个文件以供下载,那么您可以猜测当对话框出现时通过这个迂回技巧(我从 *** 对相关问题的回答中得到我问):

    当您从您的页面发出 HTTP 请求时,添加一个参数,其值为一些随机字符串(如 "random" + new Date().getTime() — 它不一定是安全的,但您希望避免冲突)

    服务器查找该参数。当它开始发回附件以供下载时,它会添加一个以您的随机字符串作为其值的 cookie。

    现在,页面发出 HTTP 请求后,它会启动一个间隔计时器。计时器函数中的代码检查 document.cookie 以查找该随机字符串。只要document.cookie 包含该字符串,您就知道HTTP 响应已到达浏览器。由于您知道浏览器会要求用户保存附件,因此您可以推断此时正在显示文件对话框。

我需要的是一种处理 IE 安全问题的方法,即文件附件来自除直接用户“点击”以外的事件。我需要关闭一个模式对话框,所以我需要知道 HTTP 响应何时返回。

【讨论】:

那值得一试,我会在尝试后通知你结果。谢谢。【参考方案2】:

因为页面被锁定,你不能用 JavaScript 做任何事情,因为它也被锁定了。

但是,你想做什么?您是否试图以某种方式记录用户正在下载文件的事实?如果是的话,有更好的方法可以做到这一点,它们在服务器端。使用一些服务器端脚本语言来提供文件并记录它被下载的事实。

如果这不是您想要做的,那么唯一的方法是在链接上使用onclickonunload/onbeforeunload,但这些不太可靠,我相信您会完全找到不同浏览器上的不同行为。

其实,现在想起来,还有一种方法,但是很脏。这个想法是设置一个间隔以每秒运行一次,并检查两次运行之间是否超过一秒。比如:

var lastTime = new Date().getTime();
function checkTime() 
    var curTime = new Date().getTime();
    if (curTime - lastTime > 1100)  // 1100 because there might be small browser lags 
        // do something after the dialog appeared and the user did something with it
    
    lastTime = curTime;

setInterval(checkTime, 1000);

请注意,有些浏览器(我认为 Chrome 就是一个例子)在打开该对话框时不会阻止页面,因此这可能不起作用。如果您打算使用它,请务必仔细检查所有内容。

我现在要去洗澡了。

【讨论】:

不幸的是,该解决方案在 IE6 中不起作用。不过这很聪明:)。 我可能是它只需要一些调整才能在 IE6 上工作(我不明白为什么它不会,除非 IE6 不阻止页面)。也许 IE6 不知道.getTime() 什么的。它有任何错误吗? 实际上,IE6 确实阻止了页面,但 javascript 仍然运行。这就是它不起作用的原因。

以上是关于文件下载对话框何时打开? - HTML, Javascript的主要内容,如果未能解决你的问题,请参考以下文章

如何检测何时单击文件输入的取消?

JAVA程序中点击按钮打开文件对话框

使用 Java servlet 时何时打开以及何时关闭 mysql 连接?

怎么将sublime设置为打开指定文件格式的默认方式,而不是如图所示的这种出来对话框让自己再选择的方式?

JAVA应用打开文件对话框并输出选择的目录(简洁实用)

java用swt 如何建立选择文件夹路径的对话框?