>> 最近在做项目的时候,因为要使用到js的window.open方法,但是此方法经常会被浏览器拦截,所以也在网上查找了一下原因和解决办法,所以记录一下。 ### 原因分析 1. 当浏览器检测到非用户操作时产生的新弹出窗口,则会对其进行阻止。是因为浏览器认为你将弹出广告等用户不想得到的窗体。 2. 在chrome的安全机制里面,非用户触发的window.open方法,是会被拦截的。 3. 只有直接使用js调用 window.open(url); 打开新窗口时,才会被拦截,如果是改变原理额窗口:window.open(url,'_self'); 则不会被拦截。 4. 如果不想让浏览器拦截,则改为用户触发行为,这样浏览器就认为是用户想访问这个页面,而不是直接弹出给用户。 ### 解决办法 * 方法一: var botton = $('#botton'); botton.click(function () { window.open('xxx'); }); var botton = $('#botton'); var url = 'xxx'; botton.click(function () { //打开一个不被拦截的新窗口 var pop = window.open('about:blank', '_blank', 'width='+window.screen.width+', height='+window.screen.height+', ...'); $.ajax({ url: 'ooxx', type:'post', dataType:'json', success: function (url) { pop.blur(); pop.opener.focus(); pop.location = url; } }) }); * 方法二: //在超链接里加入onclick事件,如: 这样用户点击这个超链接,浏览器会认为它是打开一个新的链接,所以就不会拦截。 * 方法三: //使用 setTimeout 延时处理,也可以防止被浏览器拦截。 setTimeout('window.open(url);', 300); * 方法四: function openWin(url) { var a = document.createElement("a"); //创建a对象 a.setAttribute("href", url); a.setAttribute("target", "_blank"); a.setAttribute("id", "camnpr"); document.body.appendChild(a); a.click(); //执行当前对象 } //写法2 function openUrl(url) { var a = $('')[0]; var e = document.createEvent('MouseEvents'); e.initEvent('click', true, true); a.dispatchEvent(e); } //调用方法openWin(url) / openUrl(url) //原理都是通过创建一个a标签对象,通过里面自带的target执行跳转 * 方法五: //先通过用户点击打开页面,然后再对页面进行重定向。 var botton = $(#botton); var url = 'xxx'; botton.click(function () { // 打开页面,此处最好使用提示页面 var winPop = window.open('_blank'); winPop.location.href = 'url'; }); * 方法六: //使用form表单模拟提交 var url = 'xxx'; // 创建一个 form var FormObj = document.createElement("form"); var input = document.createElement("input"); // 设置相应参数 input.type = "hidden";//hidden input.name = "token";//id input.value = $("#id").val(); //input传递参数 document.body.appendChild(FormObj); FormObj.appendChild(input); FormObj.method = "GET"; FormObj.action = url; FormObj.target = '_blank'; FormObj.submit(); document.body.removeChild(FormObj);