我们能不能不再使用 window.open()

Can we no longer use window.open()

我在客户网站上工作,通过在表单提交的新选项卡中打开 PDF url 提交表单后下载 PDF。但在 Chrome、Safari 和 FF 中,它们都阻止了 "popup"。我注意到有几篇文章讨论了防止浏览器阻塞 window.open() 的方法。它们通常与 ajax 有关,但我没有使用 ajax。其他文章讨论了 window.open() 如何只在点击事件中起作用。即使那样对我也不起作用。

这没有多大意义,但在我的示例中,我尝试触发点击并

<script>
    jQuery( document ).ready(function() {
        jQuery(".gform_confirmation_message a").on("click", function(e){
            e.preventDefault();
            var newWin = window.open("", "_blank");
            newWin.location = jQuery(".gform_confirmation_message a").attr("href");
        });

        jQuery(".gform_confirmation_message a").trigger("click");
    });
</script>

即使我在 jquery 外面放一条简单的线,也不起作用并被阻止。

var newWin = window.open("", "_blank");

此外,这些中的任何一个都完全没有做任何事情。它甚至不会弹出被阻止的弹出窗口。

jQuery(".gform_confirmation_message a").trigger("click");
OR
jQuery(".gform_confirmation_message a").click();

我知道浏览器正在降低 spam/ad 安全性,但这太荒谬了。

仍然可以弹出窗口。它们只需要由 用户操作 触发。创建虚假 click 事件不被视为用户操作。

开始下载的一种方法是简单地将页面重定向到设置了正确内容类型的 PDF,以便立即下载:

Content-Type: application/octet-stream

Content-Disposition: attachment

使用 HTML5,您还可以通过创建临时 <a> 标记并将其 download 属性设置为文件 url 来开始下载。虚拟点击事件仍然有效。

var textFile = new Blob(["hello world"], {type: "text/plain"});
var blobUrl = URL.createObjectURL(textFile);

var a = document.createElement("a");
a.href = blobUrl;
a.download = "myTextFile.txt";
a.click();  // start the download

I know browsers are hammering down on spam/ad security but this is ridiculous.

弹出窗口很烦人。有很多方法可以在不创建无用弹出窗口的情况下下载文件 window.