为什么 AJAX 对第一个函数的响应“_blank”有效,但对第二个函数无效

Why does the response of AJAX with "_blank" work for first function, but not the second function?

本文关键字:函数 有效 第二个 blank 无效 第一个 AJAX 响应 为什么      更新时间:2023-09-26

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

控制台不显示任何内容。(铬(弹出窗口阻止程序会阻止来自第二个函数的 ajax 响应的响应链接,但不会阻止第一个函数的 ajax 响应。我不希望(铬(浏览器的弹出窗口阻止程序阻止它。这在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 请求,然后更改弹出窗口的位置。