Javascript 使用ajax中的参数调用window.open

Javascript 使用ajax中的参数调用window.open,javascript,xmlhttprequest,Javascript,Xmlhttprequest,我有一个网页,可以使用window.open和一些请求参数打开一个弹出窗口。参数是从ajax调用获得的,window.open在xhr的处理程序中被调用 var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() { if (this.readyState == 4) { switch (this.status) { case 200: wi

我有一个网页,可以使用window.open和一些请求参数打开一个弹出窗口。参数是从ajax调用获得的,window.open在xhr的处理程序中被调用

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
    if (this.readyState == 4) {
        switch (this.status) {
            case 200:
                window.open("script.php?param2="+this.responseText, "_blank", "...");
                break;
            default:
                alert('aw snap');
                break;
            }
        }
    };
xhr.open("GET", "first_script.php?param1=3", false);
xhr.send();
正如您所看到的,这个ajax调用是同步的,它在浏览器控制台中生成警告。如果将此ajax调用设为异步,则不会出现警告,但弹出窗口将被浏览器阻止,因为它不是由用户直接调用的

我基本上需要使用ajax调用获取一些数据,等待它,然后使用获取的数据作为请求参数调用window.open

我在这里看到了有关如何等待异步请求的解决方案:

但是,该主题中的讨论建议完全避免同步调用,因为这被认为是一种不好的做法


我真的很困惑。你能给我一个提示,如何实现这种行为,正确的方法?我认为,我试图实现的行为是相当普遍的。必须有一种正常的方法来实现这一点,而不必重新发明轮子。

您应该避免使用同步XHR,因为它在现代浏览器中已被弃用

弹出窗口拦截器通常可以阻止显示的每个弹出窗口,这些弹出窗口不是由用户直接操作触发的,比如单击按钮或链接

问题的解决方案是在发送异步XHR之前创建并存储一个新窗口,并在收到响应时更改其位置:

    var newWindow = window.open("", "_blank");
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function() {
        if (this.readyState == 4) {
            switch (this.status) {
                case 200:
                    newWindow.location = "script.php?param2="+this.responseText;
                    break;
                default:
                    alert('aw snap');
                    break;
            }
        }
    };
    xhr.open("GET", "first_script.php?param1=3", true);
    xhr.send();

为什么你不从一开始就把表单发布到一个新窗口?@epascarello因为它需要在用户actionWow上完成,没想到会这么简单。非常友好。