我需要针对以下用例的跨浏览器解决方案:用户单击我们其中一个页面上的“导出”按钮,这会打开一个带有表单的弹出窗口。在提交表单时,用户应该会收到一个二进制文件下载(例如 CSV 文件),并且弹出窗口应该在不更改父窗口的可见内容的情况下关闭。
我们不能使用超时来关闭弹出窗口,因为在下载文件之前通常会有一个对话框询问用户如何处理文件,并且无法知道用户处理这个对话框需要多长时间。
我们最初在弹出窗口中有一个脚本,它将 window.location 设置为下载文件的 URL。这使弹出窗口未关闭。
因此,我尝试在父窗口中放置一个隐藏的 iFrame,并在调用 self.close() 之前让弹出窗口将 iFrame 的 src 设置为下载 URL。这在 Firefox 中完美运行,但 IE 完全破坏了它的安全限制。
有正确的方法吗?在 IE 上工作的方式怎么样?
更新 - 问题已解决
这里提出的答案并不太远,但我的问题比 JavaScript 问题要复杂一些。我遇到了 IE 和 Excel 的错误(因为下载文件是 CSV),并且弹出窗口正在做一个表单发布。
如果不将表单数据附加到 URL(对于 GET 而不是 POST),我无法解决问题,并且我必须在 IE 中将站点设置为受信任(这是一个企业应用程序,所以这是一个合理的请求用户)。
单击表单按钮时,弹出窗口调用 window.opener 上的函数,传入表单及其操作 URL。然后弹出窗口调用 window.close()。该函数将表单数据附加到 URL 并将 window.location 设置为新 URL(iFrame 的想法在 IE 中从来没有很好地工作,显然没有必要)。
在对表单 URL 的响应中,请求头包括 Content-Type: application/octetstream and Content-Disposition", "attachment; 文件名=文件名.csv"。