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

标签 javascript ajax google-chrome

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

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

最佳答案

尝试添加

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

关于javascript - ajax 请求后的 Chrome window.open 就像弹出窗口一样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22007592/

相关文章:

javascript - 切换无状态的 React 复选框

javascript - 使用 AJAX 在页面加载时自动提交表单并获取 html 类型结果?

javascript - 在 Chrome 应用程序中记录选择选项值 HTML。

javascript - Ext JS - 专注于文本字段不适用于 IE 中的渲染监听器

javascript - 查找嵌套数组中的多个元素

javascript - AngularJS ng-repeat 与过滤器

ajax - 每秒运行一个 ajax 请求是不是很糟糕?

asp.net - 如何使用 ajax 请求重置 ASP.Net session 状态超时

javascript - 试图在 View 中将类添加到 div

javascript - 加速 Jquery/Json 搜索