为什么带有“_blank”的AJAX响应适用于第一个函数,而不适用于第二个函数?

时间:2016-02-15 07:38:51

标签: javascript jquery html html5 dom

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

控制台没有显示任何内容。 (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');

        }
    });         

}

1 个答案:

答案 0 :(得分:2)

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

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

您可以尝试:

  • 改为制作同步AJAX请求(不推荐),

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