window.open js打开新窗口被拦截,如何解决?

在这里插入图片描述

为什么会出现这个情况?

浏览器为了防止一些站点出现恶意弹窗的问题,增加了这个拦截机制。
打开window.open的两种情况:

  1. 人为触发事件:如click事件,浏览器认为是人为触发的事件能够直接打开(不拦截)
  2. js自动触发事件:如异步触发 setTimeout等,会被拦截,但是仔细分析还有如下两种情况:
    1. 小于5s内触发:不拦截(实际上在Windows版Edge v131.0.2903.99上测试,chrome未测试 小于4990毫秒不拦截,大于等于4990毫秒拦截,实际情况请自行测试

    2. 大于等于5s触发:拦截

      // 拦截
      setTimeout(()=>{
      	window.open('http://baidu.com')
      },5000)
      
      // 不拦截
      setTimeout(()=>{
      	window.open('http://baidu.com')
      },3000)
      

如何解决?

正常人为操作事件下正常打开即可
异步打开的情况使用以下方法解决:

  1. 提前创建window.open窗口
const newWindow = window.open(`${env.routerPath}loading?tip=数据正在准备中,请稍后...`)
if (!newWindow) {
  return alert("浏览器被禁止弹出新窗口,请允许弹出窗口")
}

Q:有朋友要问了,为什么打开一个路由为loading的页面?
A:如果你的异步操作等待时间比较长,打开一个空页面比较单调枯燥,用户也会疑惑是不是系统有问题,所以这里建议你创建一个loading等待的页面,给用户一个友好展示,示例如下:
此页面不需要写任何逻辑,仅展示loading状态即可,因为后面第2步会修改页面地址
在这里插入图片描述

  1. 在异步处理完成的地方写如下代码:
const url = `${env.publicPath}page1` // 异步目标跳转页面/page1
newWindow.location.href = url // 修改目标窗口的地址
newWindow.focus(); // 浏览器标签页聚焦到新窗口上
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值