javascript - 为什么 AJAX 的响应为 "_blank"对第一个函数起作用,但对第二个函数不起作用?

标签 javascript jquery html dom

我有一个jsp,其中有两个单选按钮,并根据单击的按钮调用相应的函数。这两个函数都有 ajax 调用,成功响应会在新选项卡中打开新网址。第一个函数完美地完成了任务,但第二个函数无法正常工作。

控制台没有显示任何内容。 (Chrome) 弹出窗口阻止程序会阻止第二个函数的 ajax 响应的响应链接,但不会阻止第一个函数的 ajax 响应。我不希望 (chrome) 浏览器的弹出窗口阻止程序阻止它。在 Firefox 和 Safari 中不会发生这种情况。我还没有尝试过对抗 IE。但目前仅发生在 Chrome 中。

function submit(){


    if($('input[name=questionOption]:checked').val() == "A"){   
        yesHelper();                                        
    }else if($('input[name=questionOption]:checked').val() == "B"){
        addHelper();
    }

}

function yesHelper(){
    var token = $("meta[name='_csrf']").attr("content");
    var header = $("meta[name='_csrf_header']").attr("content");

    var AQuestion = document.getElementById("A_Actual_Question_Id").value;
    var lang= "T";

    var stringifiedInput = JSON.stringify({"A_Actual_Question" : AQuestion, "language" : "T"}); 
    alert(stringifiedInput);
    $.ajax({
        url: "/Abcd/efgh/add1",
        type: "POST",           
        async: false,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        cache: false,
        data: stringifiedInput,
        beforeSend: function(xhr) {
            xhr.setRequestHeader(header, token);
        },
        success: function(response){
            window.open("http://localhost:8080/Abcd"+response, '_blank');
        }
    });         
}

function addHelper(){
    var token1 = $("meta[name='_csrf']").attr("content");
    var header1 = $("meta[name='_csrf_header']").attr("content");

    var B_Question = document.getElementById("B_ActualQuestion_Id").value;
    var lang1= "T";
    var B1 = document.getElementById("B1_Id").value;


    var stringifiedInput_B = JSON.stringify({"B_Question" : document.getElementById("B_ActualQuestion_Id").value,
    "language" : "T",
    "B1" : B1

    });

    $.ajax({
        url: "/Abcd/efgh/add2",
        type: "POST",           
        async: false,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        cache: false,
        data: stringifiedInput_B,
        beforeSend: function(xhr) {
            xhr.setRequestHeader(header1, token1);
        },
        success: function(response1){
             window.open("http://localhost:8080/Abcd"+response1, '_blank');

        }
    });         

}

最佳答案

如果您不希望浏览器阻止弹出窗口,那么您必须通过某种用户交互(例如点击某物)直接打开它 - 否则,大多数当前的浏览器阻止它在默认设置中,因为在没有用户交互的情况下打开的弹出窗口通常是用户不想要的(广告或其他烦人的东西。)

现在,首先发出异步 AJAX 请求,然后尝试在成功处理程序中打开弹出窗口,已经将其与初始用户交互“解耦”。

您可以尝试:

  • 改为发出同步 AJAX 请求(不推荐),

  • 先打开弹出窗口(地址about:blank),发出AJAX请求,然后更改弹出窗口的位置。

关于javascript - 为什么 AJAX 的响应为 "_blank"对第一个函数起作用,但对第二个函数不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35403846/

相关文章:

Javascript:在 document.onload 之前访问 DOM

javascript - 我怎样才能在javascript中循环这个模式?

javascript - Highchart 下载图像正在更改宽高比

jquery - 在页面加载时保持树状菜单打开

javascript - 外部 javascript 函数不工作

html - 如何在加载图像之前保持图像的固有大小,从而使布局稳定?

javascript - JQuery 使用 Bootstrap 4 验证表单输入和突出显示标签

javascript - 使用正则表达式和 javascript 将 HTTP url 重写为 HTTPS

javascript - Firefox 中的 Jquery SlideToggle、slideUp 和 stopPropagation

jquery - 从 jquery 之后选择类悬停