一尘不染

Ajax请求后的Chrome window.open就像弹出窗口一样

ajax

我遇到一种情况,当用户按下按钮时,我会执行ajax请求,然后使用ajax请求的结果生成要在新选项卡中打开的URL。但是,在chrome中,当我在ajax请求的成功处理程序中调用window.open时,它将在新窗口中像弹出窗口一样打开(并被popup-
blockers阻止)。我的猜测是,由于成功代码与chrome认为不是由点击触发的点击处理代码是异步的,即使它与点击有因果关系。有什么方法可以防止这种情况,而无需使ajax请求同步?

编辑 以下是一些最小的代码来演示此行为:

$('#myButton').click(function() {
    $.ajax({
        type: 'POST',
        url: '/echo/json/',
        data: {'json': JSON.stringify({
            url:'http://google.com'})},
        success: function(data) {
            window.open(data.url,'_blank');
        }
    });
});

http://jsfiddle.net/ESMUA/2/

需要澄清的一点是:我更担心它是在单独的窗口而不是选项卡中打开,而不是因为它被弹出窗口阻止程序阻止了。


阅读 380

收藏
2020-07-26

共1个答案

一尘不染

尝试添加

window.open(url,'_blank');

编辑

好吧,我认为打开不是用户操作直接结果(即非异步)的页面时,您无法绕开弹出窗口阻止程序。

您可以尝试执行以下操作,它看起来像是弹出窗口阻止程序的用户操作:

var $a = $('<a>', {
        href: url,
        target: '_blank' 
    });

$(document.body).append($a);
$a.click();

编辑2

看起来您最好保持事物同步。

只要新窗口是“相同来源”,您就可以使用JS进行操作。

$('#a').on('click', function(e){
    e.preventDefault();
    var wi = window.open('about:blank', '_blank');

    setTimeout(function(){ // async
        wi.location.href = 'http://google.com';
    }, 500);
});
2020-07-26