ajax回调中使用window.open弹窗被chrome拦截的问题

发布于 2022-09-03 13:52:20 字数 288 浏览 41 评论 0

现在想在当前页面上点击按钮之后,触发一个ajax,然后在ajax回调中拿到一个签名链接,然后调用window.open先打开一个标签页。
但是在实际操作过程中发现这个要打开的标签页被chrome给拦截了,google了一下,找到stackoverflow上的链接,尝试了了各种给出的解决方案,都失败了。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

丶情人眼里出诗心の 2022-09-10 13:52:20

找到解决方案了:
将ajax的设置为同步的,即
$.ajax({async:false,url:'xxxx'});

善良天后 2022-09-10 13:52:20

这种情况出现是由于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的几率非常高,相对来说这个方案没那么糟糕,如果产品没法接受这种情况,那就老老实实刷新当前页吧。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文