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

window.open被浏览器拦截的解决方法

时间:2023-04-02 22:48:07 HTML

现象最近在做项目的时候遇到了window.open被浏览器拦截的情况,郁闷至极。虽然在自己的环境下可以发布页面,但是对于用户来说,不能要求用户通过拦截。更有什者,当出现被封的时候,很多小白根本不知道发生了什么,也不知道去哪里看被封的页面,真是悲哀~~。另外可以发现,当window.open为用户触发事件或者加载时,是不会被拦截的。一旦将弹窗代码移到ajax或者一段异步代码中,就会出现立马被拦截的感觉。原因分析&深度研究当浏览器检测到非用户操作产生的新弹窗时,会进行拦截。因为浏览器认为这不是用户想看的页面。比如直接在js中执行,如下代码:jscode://直接打开一个页面window.open('//www.baidu.com','_blank');浏览器ie8chrome40firefox34opera27safari5.1.7是否防止弹窗NNYYY对于如下代码:js代码:document.body.addEventListener('click',function(){window.open('//www.baidu.com','_blank');});所有浏览器都不会阻止。综上所述,各个浏览器对拦截时机的判断不同,放在ajax回调中的代码响应也不同,这里不再赘述。但是,在我们的代码中被浏览器阻止弹窗并不是程序员想要的。解决方法:1、改用a标签给出如下函数,并将该函数绑定到点击事件回调上,避免大部分浏览器拦截弹窗:js代码: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();}2.使用表单的提交方法打开一个页面该方法需要构造一个from,然后js代码触发表单的提交,将表单提交到新的页面。代码比较长,这里就不写了。大家都知道有这样的解决办法。请注意,以上两个方法不适合放在ajax的回调函数中。如果将它们放在回调函数中,它们仍然会被浏览器拦截。3.终极解决方案——先弹出窗口,再重定向第三种解决方案,其实也是一个workaround。核心思想是:先通过用户点击打开页面,然后重定向页面。示例代码如下。js代码:xx.addEventListener('click',function(){//打开页面,这里最好使用提示页面varnewWin=window.open('loadingpage');ajax().done(function(){//重定向到目标页面newWin.location.href='targeturl';});});上面的方法实际上打开了两个地址,所以建议大家给个类似于'当前页面正在加载,请稍候。.’,从而避免两次打开真正的目标页面,让用户意识到页面的重定向。解决方案2:点击弹窗这种方法的缺点:实测可以解决大部分浏览器的拦截问题,但是无法解决安全软件的拦截(360不会拦截,QQ管家会拦截)