window.open打开新窗口被拦截

1.背景

项目中真实遇到此场景,但是出现频率极低,应与浏览器所处于的稳定状态也有关系

ajax请求后,then中进行新窗口的打开,当前窗口打开则未出现

2.原因

搜索相关结论如下:

浏览器检测到非用户操作产生的新弹出窗口,则会对其进行阻止。因为浏览器认为这可能是一个广告。

大佬点拨:主要看这个弹出窗口执行js的调用栈是不是线性的

3.解决方案

尝试过两个方案但针对ajax回调打开也行不通:

1)手动创建a标签并模拟点击操作
let link = document.createElement('a'); // 创建a元素
link.href = url; // 设置href属性
link.target = '_blank'; // 设置target属性
document.body.appendChild(link); // 添加到页面

link.click();
2)改交互方案

增加按钮,数据返回后高亮,再支持点击打开新页面(该方案被产品否了)

3)请求前先打开一个空白页,待数据返回后重定向

let page = window.open('about:blank'); // 打开一个空白页

ajax().then((res) => {
    page.location.href = res; // 重定向
});

4.持续思考

第三种方案还要考虑安全漏洞(会话劫持,so补充noopener noreferrer)与代码的健壮性(如果接口报错了,要关闭空白页)

验证时可通过控制台fetch接口 长延时/短时间多次打开窗口 可必现场景

其实吧,从用户角度来说,这个拦截确实不友好;从浏览器安全角度来说,它的策略也是合理的,所以见仁见义吧,看如何评估……

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当使用`window.open`方法打开一个新窗口时,有时候浏览器拦截这个操作,阻止新窗口打开。这是因为浏览器内置了一些安全机制,旨在防止恶意弹窗和广告等不受用户控制的行为。 浏览器拦截`window.open`的主要原因可能包括以下几点: 1. 弹窗拦截浏览器拦截那些未经用户交互而直接打开新窗口,以防止恶意网站滥用弹窗功能。这是为了保护用户免受不必要的干扰和潜在的安全风险。 2. 广告拦截:一些浏览器会自动屏蔽那些被认定为广告的弹窗。这些浏览器会根据广告过滤规则或者用户自定义的设置来判断哪些弹窗是广告,并将其拦截。 3. 浏览器设置:用户可能在浏览器的设置中主动选择了阻止弹窗的选项,这样浏览器就会拦截`window.open`方法打开新窗口。 如果你希望绕过浏览器拦截,可以尝试以下方法: 1. 触发`window.open`方法的操作必须是由用户主动触发的,例如在点击事件中调用`window.open`方法。这样可以避免被浏览器拦截。 2. 检查浏览器的弹窗拦截设置,确保它没有被启用或者将你的网站添加到白名单中。 3. 使用浏览器提供的替代方法,例如`window.location.href`来打开新的URL,或者使用`<a>`标签的`target="_blank"`属性来实现类似的功能。 请注意,绕过浏览器拦截机制可能会违反用户的期望和浏览器安全策略。因此,在进行任何操作之前,请确保你的意图是合法和符合用户体验的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值