最近公司开发的一个项目,平凡用到下载各种类型的文件,但是例如.txt,.jpg,.pdf格式的文件呢浏览器会在当前窗口直接打开,影响用户体验,尝试各种方案和百度总结一下几点;


原理:

当window.open为用户触发事件内部或者加载时,不会被拦截,一旦将弹出代码移动到ajax或者一段异步代码内部,马上就出现被拦截的表现了(浏览器认为这可能是一个广告,不是一个用户希望看到的页面)

常用办法页面打开方式

  1. 超链接<a href="https://www.baidu.com" title="">Welcome</a>

    等效于js代码

    window.location.href="https://www.baidu.com"; //在同当前窗口中打开窗口

  2. 超链接<a href="https://www.baidu.com/" title=""target="_blank">Welcome</a>

    等效于js代码

    window.open("https://www.baidu.com/"); //在另外新建窗口中打开窗口

  3. 关闭新窗口:this.window.opener =null; window.close();

解决方案:

  • 使用a标签替代:

给出如下函数,将此函数绑定到click的事件回调中,就可以避免大部分浏览器对窗口弹出 的拦截:

function newWin(url, id) {
var a = 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();
} function openUrl(url) {
var a = $('<a href="'+url+'" target="_blank"></a>')[0];
var e = document.createEvent('MouseEvents');
e.initEvent('click', true, true);
a.dispatchEvent(e);
} //调用方法newWin(url,'bbb') / openUrl(url)
//原理都是通过创建一个a标签对象,通过里面自带的target执行跳转
  • 在超链接里加入onclick事件,如:

//这样用户点击这个超链接,浏览器会认为它是打开一个新的链接,所以就不会拦 截。

<a href="javascript:void(0)" onclick="window.open()"></a>
  • 使用 setTimeout 包装一下,也可以防止被浏览器拦截。

//注意这里的超时时间不能太短,否则也会被拦截。

setTimeout('window.open(url);', 500);
  • 我们会遇到想要弹出一个窗口,可是却是在onckick事件执行后,才去弹出来的,这时就会被浏览器拦截,我们可以通过下面的方法来避免

//先用window.open打开一个窗口,然后修改地址。如:

var tempwindow=window.open('_blank');


呵呵哒,你以为这样就完事了?大错特错了,以上办法也就是在已声明url下有效,如果异步ajax请求获取下载路径呢?

解决1:

click: () => {
var tempwindow=window.open();//先打开临时窗体,由于是点击事件内触发,不会被拦截
this.$http.get(url+id,
{emulateJSON: true}
).then(response => {
let resd = response.data;
if(resd.code==0){
tempwindow.location.href = resd.result//当回调的时候更改临时窗体的路径
}
else{
tempwindow.close()//回调发现无需打开窗体时可以关闭之前的临时窗体
this.$Message.error(resd.message)
}
}, response => {
tempwindow.close()//回调发现无需打开窗体时可以关闭之前的临时窗体
console.log('error:', response) //for debug
});
}

解决2:

click: () => {
var flag = false;
$.ajax({
'url': url+id,
'type': 'post',
'dataType': 'json',
'data': data,
'async':false,//同步请求
success: function (data) {
$("#a").attr("href","www.baidu.com");//当回调的时候更改页面上或创建的某个a标签的href
flag = true;//更改标志
},
error:function(){ }
});
if(flag){
$("#a")[0].click();//href属性更改后模拟点击
}
}

window.open 打开新窗口被拦截的解决方案的更多相关文章

  1. window.open()打开新窗口被拦截

    window.open( url )是常用的打开新页面的方法,一般都没有问题,但是如果在ajax回调方法里面使用就会被浏览器拦截,因为在浏览器安全机制中,页面弹窗必须是由用户触发的才是安全弹窗,比如说 ...

  2. Ajax 请求后打开新窗口被拦截的解决方案

    公司业务上有个场景,需请求后台获取支付链接地址,再打开地址引导用户购买.这样的场景在其他企业应该也很场景.但是遇到个很常见的问题,Ajax后直接用window.open(url),会被浏览器作为广告拦 ...

  3. ajax请求响应中用window.open打开新窗口会被浏览器拦截的解决方式

    一.问题描述 ajax 异步请求成功后需要新开窗口打开 url,使用的是 window.open() 方法,但是会被浏览器给拦截了,需要用户点下. 二.问题分析 浏览器之所以拦截新开窗口是因为该操作并 ...

  4. 几个主流浏览器 Window.open打开新窗口 、模拟a标签打开新窗口的 表现

    Window.open打开新窗口 1.常用浏览器打开新窗口(正常打开window.open)的的不同表现形式(PC/移动端) 2.Window.open在异步处理中打开(_blank) a标签在异步处 ...

  5. window.open打开新窗口被浏览器拦截的处理方法

    一般我们在打开页面的时候, 最常用的就是用<a>标签,如果是新窗口打开就价格target="_blank"属性就可以了, 如果只是刷新当前页面就用window.loca ...

  6. 使用window.open打开新窗口被浏览器拦截的解决方案

    问题描述: 代码中直接使用window.open('//www.baidu.com', '_blank');会被浏览器窗口拦截 原因浏览器为了维护用户安全和体验,在JS中直接使用window.open ...

  7. JavaScript打开新窗口被拦截问题

    新窗口打开页面,一个很常用的效果,至于代码,一般第一反应都是这么写: window.open(url); 但是主流的浏览器都会拦截这种效果(可能这些年弹窗广告太多,如果浏览器不拦截,用户受不了)   ...

  8. js 模拟window.open 打开新窗口

    为什么要去模拟window.open() 打开一个 新的窗口呢,因为有些浏览器默认会拦截 window.open, 当需要函数中打开新窗口时,接可以使用a标签去模拟打开. /** * a模拟windo ...

  9. window.open打开新窗口 参数

    1,基本描述 oNewWindow = window.open( sURL , sName , sFeatures, bReplace) window.open在打开一个窗口(其url为sURL)后, ...

随机推荐

  1. C#_winform登陆框验证码的实现

    验证码技术已愈来愈成熟,从最初的数字.字母.字符.汉字已经到目前的语言,其应用也甚广,之前大多数只有在网站上可以看到,现在在一些客户端软件也经常可见(比如证券相关软件).之前做的一个基于 C# 客户端 ...

  2. NOIP 历年试题大致考点总结

    总的来说,水平还不够-- 要努力了! NOIP2012 D1T1 模拟, 字符串 D1T2 贪心, 数学 (推导贪心策略), 高精度 D1T3 unsolved 开车旅行 倍增 D2T1 解线性模方程 ...

  3. 登录成功后如何利用cookie保持登录状态

    Cookie是一种服务器发送给浏览器的一组数据,用于浏览器跟踪用户,并访问服务器时保持登录状态等功能. 通常用户登录的时候,服务器根据用户名和密码在服务器数据库中校验该用户是否正确,校验正确后则可以根 ...

  4. 通过生成HFile导入HBase

    要实现DataFrame通过HFile导入HBase有两个关键步骤 第一个是要生成Hfile第二个是HFile导入HBase 测试DataFrame数据来自mysql,如果对读取mysql作为Data ...

  5. mysql学习(1)----------基础语法

    进入mysql mysql -u用户名 -p密码 初始用户为root   初始密码为空   status; 查看当前用户,以及数据库的字符集和其他参数的设置 set db  characterset= ...

  6. 为GitLab帐号添加SSH keys并连接GitLab

    https://blog.csdn.net/xyzchenxiaolin/article/details/51852333 为github帐号添加SSH keys使用git clone命令从GitLa ...

  7. HDU 5125 magic balls(线段树+DP)

    magic balls Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  8. 【转】 linux下配置squid 服务器,最简单使用方式

    linux下配置squid 1.什么是squid Squid cache(简称为Squid)是一个流行的自由软件(GNU通用公共许可证)的代理服务器和Web缓存服务器.Squid有广泛的用途,从作为网 ...

  9. vue项目在webpack打包后背景图片显示不了

    加上 publicPath:'../../'即可

  10. Codeforces 1197E Culture Code DP

    题意:你有n个俄罗斯套娃,已知每个套娃的容积和体积,问有多少个子集满足以下条件: 1:这个子集是一个极大子集,即不能再添加其它的套娃到这个子集里. 2:子集的套娃之间的间隙和最小. 思路1:线段树优化 ...