有没有办法检测JavaScript下载的开始?

有没有办法检测JavaScript下载的开始?,javascript,html,iframe,download,Javascript,Html,Iframe,Download,在我们当前的项目中,我们提供了一个PDF下载,用户可以通过提交的HTML表单进行定制。动态生成PDF需要几秒钟的时间,我想将其可视化,例如禁用submit按钮,直到下载开始。不幸的是,我找不到一种方法来检测下载何时开始*。所以我不知道什么时候重新启用提交按钮 我已经尝试将IFrame指定为HTML表单的目标,希望触发onload事件。但事实并非如此——可能是因为PDF发送时带有“Content-disposition:attachment”标题,并且实际上没有加载到IFrame中 我现在能想到的

在我们当前的项目中,我们提供了一个PDF下载,用户可以通过提交的HTML表单进行定制。动态生成PDF需要几秒钟的时间,我想将其可视化,例如禁用submit按钮,直到下载开始。不幸的是,我找不到一种方法来检测下载何时开始*。所以我不知道什么时候重新启用提交按钮

我已经尝试将IFrame指定为HTML表单的目标,希望触发
onload
事件。但事实并非如此——可能是因为PDF发送时带有“
Content-disposition:attachment
”标题,并且实际上没有加载到IFrame中

我现在能想到的唯一解决方案是在服务器上生成一个临时文件的PDF,这是我想要避免的


*)让我澄清一下:我不需要知道下载是否已经完成,甚至不需要知道下载是否真的开始了。我想检测浏览器询问用户是打开还是保存文件的时间点。我猜当浏览器收到HTTP头时会发生这种情况。

您想要的是能够检测到下载文件的大小何时从0变为正值。据我所知,使用javascript是不可能做到这一点的——您需要一个能够访问客户端文件系统的插件


建议的解决方法:每次下载创建一个会话。让客户端轮询服务器有关下载的状态。这可能是“不存在”、“未开始”、“已开始”、“已完成”。您需要一些服务器端的工作来持久化和更新下载状态,再加上一个AJAX框架。

最简单的解决方案是估算时间(慷慨地)并这样做。这是一个黑客,但它提供了预期的效果。另一个选项可能是使用Ajax提交带有回调的表单,以提交表单,并让生成器将详细信息返回到调用页面。这可能是一个很好的开始选择。

如果我是你,我会使用信息对服务器进行AJAX调用,生成文件,然后将文件名/id/任何内容返回到javascript,然后使window.location类似于download.php?id=x(但是文件已经生成,所以它只是设置标题并读取)在哪一点上可以重新启用提交。

您想知道下载何时开始或何时完成吗?不管怎样,我不认为临时文件会有什么不同。在客户端,您无法判断文件是在服务器上还是在运行中生成的。因此,您提交表单,对此提交的响应是PDF文件?在暂停期间,浏览器处于等待服务器响应的模式?这是否正确?@Breton:正确!@Pretaul:我想知道下载何时开始。因此,我可以创建一个临时文件,向隐藏的IFrame发送一些HTML响应,然后在onload处理程序中通过JavaScript获取临时文件。我知道你已经接受了这个问题的答案,但你可能想看看我就这个问题所做的一篇博文:@Jesse使用cookies来解决这个问题确实是一个聪明的主意!这个案例已经晚了大约6年,但它可能很容易记住。谢谢你的提醒。谢谢你的回答!我真的不在乎实际下载(归档),知道何时收到HTTP响应头就足够了。我还不太确信,这不能用javascript来完成。你建议的解决方法比我想要的要复杂一些。但我想它会起作用,这肯定是迄今为止最好的主意。我仍然不太确信有更好的解决方案。但我现在,我接受这个答案。再次感谢。这个解决方案最适合小应用程序,因为它不需要更改小应用程序(有时不可能),而且非常可靠(它会在浏览器中检测到类似“允许java插件”提示的情况)。但作为缺点,它需要额外的后端服务。感谢您的回答!您所描述的是我提到的并且我希望避免的“临时文件”解决方案。噢,我很抱歉。完全没有看到这一部分。