在弹出窗口阻止程序捕获超时后使用Javascript打开一个新窗口

时间:2013-12-17 15:56:19

标签: javascript web cross-browser popup

我遇到的情况是我想让用户下载PDF。生成此PDF可能需要几秒钟,我不希望Web服务器线程等待生成PDF,因为这意味着该线程无法处理其他传入请求。

所以,我想要做的是介绍以下网址模式:

  • /request_download调用后台作业生成PDF;
  • /document.pdf将在生成PDF后为其提供服务

用例如下。

用户点击“下载PDF”。这将调用一段Javascript,它将显示一个微调器,向/request_download发出请求并接收HTTP 202 Accepted,表示请求已被接受并且后台作业已创建。然后,JS应该定期轮询/request_download url,直到它获得HTTP 201 Created,表明已经创建了PDF。包含Location标头,供JS用于将客户端转发到/document.pdf必须在新窗口中(或标签,至少它不应该替换当前页面)。我们用户的专业水平非常低,所以当我转到网址时,他们可能不知道如何回到网站。

问题

现在,window.open可以正常工作,如果用户通过点击事件调用它。但是,一旦看到201 Created响应,我想通过window.open在回调函数中调用setInterval。但是,浏览器不会喜欢它并将其解释为弹出窗口,导致它被IE8-10以及Chrome上的弹出窗口阻止程序捕获。这是有道理的。

我也无法打开一个新窗口并在那里调用Javascript。在这种情况下,用户会看到一个带有微调器的空白页面。如果该页面然后转发到/document.pdf,IE将显示此黄色警告栏,告知它阻止下载文件。 Chrome和Firefox会毫无问题地执行此操作,但很大一部分用户使用的是IE。

我尝试了什么,但没有效果

  • window.open(位置)
  • 将iframe的src设置为检索位置
  • 手动将<a>标记添加到文档正文并尝试使用javascript
  • 单击它
  • <a>标记添加到文档正文并在其上调用MouseEvent
  • 部分工作:打开用户点击并存储对它的引用的新窗口,然后执行异步请求,完成后,设置先前打开的窗口的位置。但是:IE会阻止这个并说它阻止了文件的下载。所以仍然不是一个完全有效的解决方案。

我完全没有关于如何完成这项工作的想法,并决定向互联网寻求帮助。我希望你们可以帮助我,或者认识到这个问题。提前谢谢!

0 个答案:

没有答案