_blank被阻止弹出窗口,我该如何防止这种情况发生?

5

我在服务器上创建了一个PDF文件,当我使用以下代码:

        function GetPdf(document) {


            //Stores the data and creates the html,pdf file
            $http.post('createpdf/', document).success(function(data){

                console.log(data.filename);

                window.open('download2/'+data.filename+".pdf", "_self");


            });

我在谷歌浏览器中遇到了一个弹出窗口被阻止的错误提示。当我使用“启用此网站的弹出窗口”选项时,一切正常。是否有任何解决方法?因为这可能会让一些用户感到困惑。

但是当我使用:

window.open('download2/'+data.filename+".pdf", "_self");

它可以在没有警告的情况下打开页面,但主应用程序会被 PDF 替换,这不是我想要的结果。
4个回答

8
浏览器对JavaScript何时允许弹出窗口有严格规定,但可以概括为“仅响应用户操作时”。收到HTTP请求的响应不是用户操作,因此弹出窗口被禁止。
这里的简单解决方案是不使用JavaScript。Ajax的目的是在不离开页面的情况下与服务器通信,但您无论如何都将离开页面,因此使用Ajax没有任何意义。只需使用常规表单提交即可。
<form method="post" action="createpdf/" target="_blank">

然后,服务器端脚本应该将重定向到已创建的PDF的URL,而不是将URL作为JSON返回。


0

我猜你正在使用外部JavaScript库,我在另一个项目中遇到了同样的问题,我使用了target="_tab",它起作用了,我在this question.上找到了这个方法。 这是Chrome处理JavaScript弹出调用的方式,当你使用库时会出现这种情况,我使用Moment.js触发了类似的事件,并遇到了相同的问题。


谢谢您的建议,但仍然会阻止Google Chrome中的PDF文件。 - Greg

-1

弹出窗口阻止不是问题,而是一种本地浏览器功能,可以保护用户免受弹出窗口地狱的困扰。 我建议在模态弹出窗口中打开PDF,而不是在新的浏览器窗口中。

使用一些jQuery代码很容易实现:文档可以在这里找到。


谢谢,我会研究一下。 - Greg

-1

你总是可以使用另一种方法,例如不使用window.open函数。你可以使用window.location函数,或许。Windows.location.replace会在同一个标签页中重新定位你。

<script type="text/javascript">
<!--loc can be any changed to your window-->
var loc = "https://google.com/";
window.
window.onclick = function() {
   window.open(loc);
}
</script>

试一下这个 :) 因为你没有使用点击功能,所以 window.open 被阻止了。出于安全考虑,大多数网络浏览器都会阻止此功能。


我更新了我的问题,因为我不能使用window.onclick。 - Greg
使用onclick函数的Window.open是最好的选择。你只是想在Chrome中打开一个新标签页吗?你能更具体一些吗? - aidangig

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