当前位置: 首页 > Web前端 > HTML5

window.open 打开新窗口被拦截的解决方案

时间:2023-04-05 14:54:49 HTML5

公司最近开发的一个项目,通常用于下载各种类型的文件,但是对于.txt、.jpg、.pdf格式的文件,浏览器会显示在当前窗口直接打开,影响用户体验。尝试各种解决方案和百度总结几点;原理:当window.open为用户触发事件或加载时,不会被拦截。一旦将弹窗代码移到ajax或者一段异步代码内部,就会立即出现被屏蔽的表现(浏览器认为这可能是广告,不是用户想看的页面)。常用打开页面方法:超链接欢迎相当于js代码window.location.href="https://www.baidu.com";//同当前窗口打开窗口超链接欢迎相当于js代码窗口。打开("https://www.baidu.com/");//在另一个新窗口中打开窗口并关闭新窗口:this.window.opener=null;窗口关闭();解决方案:改用标签:给下面的函数,绑定这个函数到点击事件回调,可以避免大部分浏览器拦截弹窗:functionnewWin(url,id){vara=document.createElement('a');a.setAttribute('href',url);a.setAttribute('target','_blank');a.setAttribute('id',id);//防止重复添加if(!document.getElementById(id)){document.body.appendChild(a);}a.click();}函数openUrl(url){vara=$('')[0];vare=document.createEvent('MouseEvents');e.initEvent('点击',true,true);a.dispatchEvent(e);}//调用方法newWin(url,'bbb')/openUrl(url)//原理是创建一个a标签对象,通过内置的target执行跳转,并添加一个超链接的onclick事件,比如:://这样用户点击这个超链接,浏览器会认为是打开了一个新的链接,所以不会拦截用setTimeout包裹起来,防止被浏览器拦截。//注意这里的超时时间不能太短,否则会被阻塞。setTimeout('window.open(url);',500);我们会遇到一个想弹出的窗口,但是在onckick事件执行后才弹出,此时会被浏览器拦截,我们可以通过下面的方法来避免//先用onckick打开一个窗口window.open,然后修改地址。如:vartempwindow=window.open('_blank');呵呵,你以为这就结束了吗?大错特错,上面的方法在声明的url下有效,异步ajax请求获取下载路径怎么办?方案一:click:()=>{vartempwindow=window.open();//先打开临时窗口,因为是在点击事件中触发的,所以不会被拦截this.$http.get(url+id,{emulateJSON:true}).then(response=>{letresd=response.data;if(resd.code==0){tempwindow.location.href=resd.result//改变临时窗体的路径回调时}else{tempwindow.close()//回调发现之前的临时窗口可以在不需要打开窗口时关闭this.$Message.error(resd.message)}},response=>{tempwindow.close()//Callback发现可以在不需要打开窗体的时候关闭之前的临时窗体console.log('error:',response)//fordebug});}解决方法二:点击:()=>{varflag=false;$.ajax({'url':url+id,'type':'post','dataType':'json','data':data,'async':false,//同步请求成功:function(data){$("#a").attr("href","www.baidu.com");//改变页面上或回调时创建的a标签的hrefflag=true;//更改标志},error:function(){}});if(flag){$("#a")[0].click();//href属性改变后模拟点击}}