回调函数中不允许弹窗

在chrome中使用ajax请求后在回调函数中使用window.open("xxxxx")会被chrome提示有弹,就算设置asyn为false也同样不能解决。

已经尝试过:
1.在页面后写好表单后在回调函数通过id找到该标签进行click()同样被禁止

$.ajax({
                url: ...
                data: ...
                type: "post",
                dataType: "json",
                cache: false,
                async: true,
                success: function(t) {
                
                window.open("/.../..."); 不允许打开
                
                }
}
阅读 7k
10 个回答

贴一个之前相关问题的答案

这种情况出现是由于window.open的执行时机,你的window.open是在ajax回调中执行,无论是同步还是一步,等待ajax返回结果需要一定的时间,当你得到结果再去执行window.open,chrome认为这是一种不友好的行为(非用户主动点击打开弹窗),所以会被屏蔽。
碰巧在之前的项目中也遇到过,试了各种方法,最后发现没有什么特别完美的方法可以绕开这个限制,使用了一个方法:用户点击时立马打开一个空白页,然后等ajax回来的结果,拿到链接地址,替换掉之前空白页的url。

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

    setTimeout(function(){ // 异步,模拟ajax
        wi.location.href = 'http://google.com';
    }, 500);
});

如果网络正常能返回url地址倒不会造成太大的用户体验上的问题,就怕没法正常返回url,这个时候用户那块就出现了一个空白页,如果产品必须重新打开且能返回url的几率非常高,相对来说这个方案没那么糟糕,如果产品没法接受这种情况,那就老老实实刷新当前页吧。

$('#a').on('click', function(e){

e.preventDefault();
win = window.open('about:blank', '_blank');
$(win.document.body).html("<p style='text-align: center;'>正在加载内容,请稍后</p>"

setTimeout(function(){ // 异步,模拟ajax
    win.location.href = 'http://google.com';
}, 500);

});

跟一楼的一样,只不过可以加个提示。

为什么我的项目中安然无恙的location了呢

是浏览器禁止了弹窗吧?

能贴出代码吗?我怀疑你click的动作在append之前,还没append就绑定click事件,所以没绑定到

贴出代码来吧

是被浏览器给禁掉了。 你可以这样:当你异步请求回调之后用$.trigger('callBack',data)抛出一个事件。监听到事件之后就可以打开页面或者提交表单操作都行

明显是被禁止了。。

window.open 会被浏览器拦截掉

但是当这样写的时候,浏览器不会拦截掉

$('#xxx').click(function() {
    window.open()
});

只有经过一个ajax请求后的回调里面调用window.open会被浏览器认为是一个广告弹出层会被浏览器拦截

将ajax的设置为同步的,即

$.ajax({async:false,url:'xxxx'});

然后在回调函数中,就可以使用window.open了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏