触发window.open作为ajax完成

时间:2018-11-10 11:05:49

标签: javascript cors window.open

在一个网站中有一些jQuery ajax调用,如果成功,其中一些会在另一个域中触发winwdow.open。我拥有其他域站点。

例如:

  1. 站点https://site1.example.com对自身进行ajax调用
  2. 如果成功触发window.open,则在https://site1.example2.comhttps://site2.example.com
  3. 弹出窗口阻止程序通常会阻止操作

如何处理此问题?我必须在站点/服务器https://enable-cors.org/上启用CORS吗?

代码(当然,我不属于Google)

$.ajax({
    url:'/echo/js/?js=hello%20world!',
    complete: function (response) {
        $('#output').html(response.responseText);
        window.open('https://www.google.com');
    },
    error: function () {
        $('#output').html('Bummer: there was an error!');
    },
});

演示:https://jsfiddle.net/IrvinDominin/nbsu3hgk/

2 个答案:

答案 0 :(得分:1)

我最近遇到了像您这样的问题。就我而言,我需要在打开新页面之前执行一些操作。 我要求对锚标记打开新页面,并在操作返回否定结果时使用了preventDefault方法来避免打开页面。

<a href="https://www.google.com" targe="_blank" onclick="doSomeOperation(event)">text</a>  

<script>
function doSomeOperation(event){
$.ajax({
    async:false,
    url:'/echo/js/?js=hello%20world!',
    complete: function (response) {
        $('#output').html(response.responseText);
    },
    error: function () {
        event.preventDefault();
        $('#output').html('Bummer: there was an error!');
    },
});
}
</script>

答案 1 :(得分:0)

由于window.open需要直接的用户操作(例如单击)来避免弹出窗口阻止程序,因此您可以这样更改代码:

$.ajax({
    url:'/echo/js/?js=hello%20world!',
    complete: function (response) {
        $('#output').html(response.responseText);
        //window.open('https://www.google.com');
        $( "body" ).append('<button id="openPopup">Open Site</button>');
        $( "#openPopup" ).click( function() { 
                window.open('https://www.google.com');
        });
    },
    error: function () {
        $('#output').html('Bummer: there was an error!');
    },
});

如果ajax请求成功,将向用户显示一个按钮,用户必须单击该按钮才能进入另一个域。

编辑:我认为以下是您的评论:

var myPopup;
$( document ).on("click", "#myButton", function() {
    myPopup = window.open("/");

    $.ajax({
        url:'/echo/js/?js=hello%20world!',
        complete: function (response) {
            $('#output').html(response.responseText);
            //window.open('https://www.google.com');
            myPopup.location.href = 'https://www.google.com';
        },
        error: function () {
            $('#output').html('Bummer: there was an error!');
        },
    });
});

您必须首先为新窗口声明一个全局变量。单击触发ajax请求的按钮后,您将打开一个新窗口,该窗口引用您当前的域(在您的情况下为https://site1.example.com/)。这是直接的用户操作,因此没有弹出窗口阻止程序生效。

complete函数中,您可以将该窗口重定向到其他域之一(https://site1.example2.comhttps://site2.example.com),等等。我已经使用激活的弹出窗口阻止程序对其进行了测试,并且可以正常工作。