IE9,下载,关闭弹出窗口

11

在我的应用程序中,用户可以将他们的工作导出到Excel。

它的工作原理是通过打开一个弹出窗口(window.open(...)),然后父窗口将数据写入表单,然后将表单提交回服务器。

服务器生成文件,并将其流式传输回弹出窗口,在那里下载对话框出现。 它还使用一个令牌编写了一个cookie。

此令牌对于每个下载弹出窗口都是唯一的,当窗口检查该cookie时(定期检查),它会关闭自身并使用window.close()关闭,因为用户已经收到了文件下载提示。

这在IE7和IE8中非常有效。

然而,由于IE9决定摆脱对话框并用信息栏替换它,所以窗口在用户采取行动下载之前就关闭了,如果他们确实点击了它,则不会在没有手动打开下载对话框的情况下知道何时完成下载。

作为临时解决方案,不再关闭弹出窗口。

但是,我想能够为用户关闭它,因为一旦他们的下载开始,它对他们完全无用。

如何关闭此窗口并仍然能够在IE9中向用户发出下载完成并可以打开的警报?


4
你可以使用一个(隐藏的)iframe 而不是一个弹出窗口吗? - Gerben
1
@Gerben,不行,因为下载可能需要很长时间,这是应用程序中的一项导出任务,我希望它在单独的窗口中进行,以便用户可以继续使用该应用程序。 - CaffGeek
下载不应该在页面卸载时停止。唯一的问题是如果您需要先上传大量数据。在这种情况下,用户无法离开页面,直到上传完成并出现下载对话框。 - Gerben
@Gerben,我是这个意思,弹出窗口会显示“正在生成下载”,可能需要长达5分钟,然后会出现下载消息,用户可以选择下载(之后我想自动关闭窗口)。但是,如果我把它放在iframe中,那么如果在这5分钟内用户更改了页面,他们的下载就永远不会出现。 - CaffGeek
您可以轮询窗口的内部高度。如果信息栏出现,innerHeight 应该减小。然后当信息栏消失时,innerHeight 应该返回旧值。(假设该栏消失,并且不会被“正在下载”的进度栏替换。我不使用 IE,所以我不确定。) - Gerben
3个回答

3
使用iframe - 它们的效果更好,而且你有更多的控制。只需设置display: none;即可。

2
不是在这种情况下,因为我希望它在新窗口中打开,这样用户可以在不停止下载的情况下继续使用应用程序。如果它在iframe中,并且他们导航到新页面,则iframe会丢失,下载永远无法完成。 - CaffGeek

2
我刚刚做了类似的事情。我的解决方案是摆脱window.open,而是使用Content-Disposition来强制浏览器下载文档而不是打开它
更改服务器代码,在生成Excel文档之前插入此HTTP标头,然后更改所有下载按钮/链接为普通链接,例如 <a href="server/document">下载报告为Excel</a>
Content-Disposition: attachment; filename=someFilename.xls

编辑:抱歉,我错过了五分钟渲染时间的部分。

您仍然可以使用Content-Disposition和一点点Javascript来完成此操作。让服务器在文档生成后返回报告。然后关闭由window.open打开的窗口,并让主窗口加载具有Content-Disposition标头的文档。


这可能会起作用...他们只是不能关闭主窗口,但如果他们转到另一页,不确定会发生什么。 - CaffGeek
在这种情况下,我会采用完全不同的方法。使用后台工作程序或后台服务来生成文档,而不是在HTTP请求的上下文中完成。网络并不真正适合这样的东西。然后只需告诉用户“正在为您创建Excel文档,请稍后再回来”。每次用户访问文档下载页面时,都要检查文档是否完成,并提供“正在处理…”消息或下载链接。 - Anders Marzi Tornblad
使用相同的方法,它可以完美地工作。您还可以在页面上运行异步调用以检查文件是否已创建。当它报告它已更改“开始创建”链接为“下载”链接并从服务器发送文件,就像atornblad所说的那样…… - Asken

-1

2
在IE9中运行什么代码可以在下载开始后关闭弹出窗口? - gen_Eric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接