window.open被浏览器拦截的问题(附解决方案)

window.open被浏览器拦截的问题(附解决方案)

最近用window.open()的时候,常常会被浏览器拦截(如果是chrome,则会生成一个弹窗显示页面,且也会被拦截)。

百思不得其解,后在网上找了很久资料才搞清楚,是浏览器的广告拦截功能在作祟:

 

1、  一般情况下,如果在js中调用window.open()函数去打开一个新tab页,浏览器会进行拦截,认为打开的是一个广告页。

2、  所以如果不想让浏览器拦截,可以将这个函数改为用户点击时触发,这样浏览器就认为是用户想访问这个页面,而不是你直接弹出给用户。

3、  即使是用户点击事件,如果在一次事件里调用多次window.open()函数,则只有第一次被当作正常打开,之后的还是会被当作广告页。

4、  如果在点击事件里有ajax调用,window.open()在回调函数里执行,则浏览器仍然认为是js调用并当作广告拦截。除非ajax设置为同步模式。

5、  对于这种情况,可以使用如下代码解决:

var newWin = window.open();
$.ajax({
    url:xxx,
    success: function(data){
        newWin.location = data.url;
    }
});
可以使用var x =window.open(url);然后判断x == undefined来判断是否弹出成功。

 

其他场景:

有的下载功能是这样实现的,当用户点击某个按钮后,在后台生成一个地址返回给前端,前端在请求的回调方法中,通过window.open()打开这个链接

由于前端需要给后台发送异步请求,所以window.open()也会被拦截

可行的方法是,在回调之后,生成一个标签,且href设置为下载地址,然后触发这个标签的点击事件,注意:标签一定要加一个download属性,否则还是会被拦截

你可能感兴趣的:(JS)