ajax请求后的Chrome window.open就像popup一样

时间:2014-02-25 07:39:27

标签: javascript ajax google-chrome

我的情况是,当用户按下按钮时,我执行ajax请求,然后使用ajax请求的结果生成我想在新选项卡中打开的URL。但是,当我在ajax请求的成功处理程序中调用window.open时,在chrome中,它会在弹出窗口的新窗口中打开(并被弹出窗口阻止程序阻止)。我的猜测是,由于成功代码与点击处理代码是异步的,因为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/

一个澄清的说明:我更倾向于在单独的窗口而不是标签中打开它,而不是我被弹出窗口阻止程序阻止。

5 个答案:

答案 0 :(得分:19)

尝试添加

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);
});

答案 1 :(得分:14)

尝试添加async:false。它应该工作

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

答案 2 :(得分:10)

对我有用的是:

var win = window.open('about:blank', '_blank');

myrepository.postmethod('myserviceurl', myArgs)
.then(function(result) {
    win.location.href = 'http://yourtargetlocation.com/dir/page';
});

当你仍然在范围内时,在同步调用之前打开新窗口选项卡,抓住窗口句柄,然后在收到承诺中的ajax结果后重新导航。

答案 3 :(得分:8)

@pstenstrm上面发布的答案(编辑2)大多有效,但我只添加了一行来使解决方案更加优雅。在我的情况下,ajax调用花了一秒多的时间,面向空白页的用户提出了一个问题。好消息是,有一种方法可以将HTML内容放在我们刚刚创建的新窗口中。

e.g:

$('#a').on('click', function(e){
    e.preventDefault();
    var wi = window.open('about:blank', '_blank');
    $(wi.document.body).html("<p>Please wait while you are being redirected...</p>");

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

这会在新标签中填入文字&#34;请等待您重定向...&#34;这似乎比用户查看空白页一秒钟更优雅。我希望将此作为评论发布,但没有足够的声誉。

答案 4 :(得分:1)

没有可靠的方法。如果您的选项卡/窗口已被FF和IE6 SP2中的弹出窗口阻止程序阻止,则window.open将返回值null。

https://developer.mozilla.org/en-US/docs/Web/API/Window/open#FAQ

  

如何通过弹出窗口拦截器阻止我的窗口被阻止?随着   Mozilla / Firefox和Internet Explorer 6的内置弹出窗口阻止程序   SP2,你必须检查window.open()的返回值:它将是   如果不允许打开窗口,则返回null。但是,对于大多数其他   弹出窗口拦截器,没有可靠的方法。