现在想在当前页面上点击按钮之后,触发一个ajax,然后在ajax回调中拿到一个签名链接,然后调用window.open先打开一个标签页。但是在实际操作过程中发现这个要打开的标签页被chrome给拦截了,google了一下,找到stackoverflow上的链接,尝试了了各种给出的解决方案,都失败了。
找到解决方案了:将ajax的设置为同步的,即$.ajax({async:false,url:'xxxx'});
$.ajax({async:false,url:'xxxx'});
这种情况出现是由于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的几率非常高,相对来说这个方案没那么糟糕,如果产品没法接受这种情况,那就老老实实刷新当前页吧。
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
暂无简介
文章 0 评论 0
接受
发布评论
评论(2)
找到解决方案了:
将ajax的设置为同步的,即
$.ajax({async:false,url:'xxxx'});
这种情况出现是由于window.open的执行时机,你的window.open是在ajax回调中执行,无论是同步还是一步,等待ajax返回结果需要一定的时间,当你得到结果再去执行window.open,chrome认为这是一种不友好的行为(非用户主动点击打开弹窗),所以会被屏蔽。
碰巧在之前的项目中也遇到过,试了各种方法,最后发现没有什么特别完美的方法可以绕开这个限制,使用了一个方法:用户点击时立马打开一个空白页,然后等ajax回来的结果,拿到链接地址,替换掉之前空白页的url。
如果网络正常能返回url地址倒不会造成太大的用户体验上的问题,就怕没法正常返回url,这个时候用户那块就出现了一个空白页,如果产品必须重新打开且能返回url的几率非常高,相对来说这个方案没那么糟糕,如果产品没法接受这种情况,那就老老实实刷新当前页吧。