当前位置: 首页 > news >正文

vue3项目edge浏览器无法最小化问题排查

先说结果:没完美解决

问题描述
项目框架:vue3 + vue router 4.6 + vite + 其他的
浏览器:Edge 44.0.3719.115(2026.2.6 检测的最新版本)

今天项目迭代时,突然出现的情况,浏览器无法最小化,表现为最小化时会成功,但是立马又弹出来。

疑点如下:

只有当前激活的标签页访问的是该项目时才会复现(本地运行或部署的远程环境都可以),切换到其他标签页就没事
其他浏览器没事,Edge 的问题
代码回退到前几天没出问题的时候,仍能复现
初步分析结果:

Edge 可能发生过更新(最近没有动过配置)
其他页面没问题,应该是项目中代码触发了问题
定位问题
垃圾 Edge 没办法动,只能去代码中找找是哪里触发了。

既然是页面最小化时触发的问题,那先监听一下浏览器事件,编写了一个脚本去查看注册了那些事件,并在触发的时候打印下回调函数内容:

function monitorExistingEventListeners() {console.log('🎯 监控已有事件监听器...')if (typeof getEventListeners !== 'function') {console.error('❌ API getEventListeners 不可用')return}// 监控的目标元素const targets = [window, document]targets.forEach(target => {const listeners = getEventListeners(target)const eventTypes = Object.keys(listeners)console.log(`📋 ${target === window ? 'window' : 'document'} 事件:`)eventTypes.forEach(eventType => {const eventListeners = listeners[eventType]console.log(`   📍 ${eventType}: ${eventListeners.length} 个监听器`)eventListeners.forEach((listenerInfo, index) => {// 替换监听器const originalListener = listenerInfo.listenerconst wrappedListener = function (...args) {console.log(`📢 [${eventType}] 触发`)console.log(`       函数: ${listenerInfo.listener.toString()}.`)// 执行原始监听器return originalListener.apply(this, args)}// 移除原监听器,添加包装后的监听器target.removeEventListener(eventType, originalListener, listenerInfo.useCapture)target.addEventListener(eventType, wrappedListener, listenerInfo.useCapture)})})})console.log('✅ 已有事件监听器监控已启动')
}// 立即执行
monitorExistingEventListeners()

页面加载完后,在粘贴到控制台执行,结果如下:

操作一下最小化,控制台日志如下:

移除这个 visibilitychange 事件后,最小化就正常了:

const listeners = getEventListeners(document).visibilitychange
if (listeners && listeners.length > 0) {listeners.forEach(listener => {document.removeEventListener('visibilitychange', listener.listener)})console.log('已移除 visibilitychange 监听器')
}

接着全局搜 beforeUnloadListener 方法,看看是哪里调用的,原来是 vue router 的代码:

问题应该是出现在 history.replaceState 这里,尝试重写它的逻辑:

// 这块代码写在引入 vue router 之后
const originalReplaceState = window.history.replaceStatewindow.history.replaceState = function (state, title, url) {console.log('🚨 history.replaceState 被调用,已拦截')// originalReplaceState.call(this, {}, '', '')originalReplaceState.call(this, null, '', '')
}

测试结果:当 replaceState 接收的第一个参数不为空时就会复现,即修改历史记录会复现。

模拟问题复现
为了进一步确认问题仅来源于 history.replaceState 方法,编写一个 demo 去复现:

<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Edge最小化问题测试</title></head><body><script>function beforeUnloadListener() {if (document.visibilityState === 'hidden') {// window.history.pushState({}, '')window.history.replaceState({}, '')}}// 页面加载后立即绑定监听器window.addEventListener('load', function () {// 绑定 visibilitychange 事件监听器document.addEventListener('visibilitychange', beforeUnloadListener)console.log('监听器已绑定')})</script></body>
</html>

一开始直接用本地文件访问的方式(浏览器直接打开文件:File 协议)打开,并没有复现。

后来反复对比了 vue router 代码没有发现什么差异,想到可能是运行方式不同,于是用 Live Server 起了个服务再去访问,终于复现成功了。

尝试了下 pushState 也能复现。

临时解决
至此事情已经搞清楚了:垃圾 Edge 在处理页面的历史状态更新时,可能触发了内部的 “页面激活” 机制。

查不到 Edge 有没有配置能够修改这个,Edge 动不了。

beforeUnloadListener 是 vue router 一直都有的重要逻辑,回退版本也存在。

为了不影响客户正常访问,暂时只能先把 replaceState 重写,等 Edge 修正了这个问题再把功能还原:

window.history.replaceState = function () {console.log('🚨 history.replaceState 被调用,已拦截')return
}

!!垃圾 Edge

转载自:https://blog.csdn.net/u012961419/article/details/157805074

http://www.jsqmd.com/news/381430/

相关文章:

  • 权威推荐!AI教材生成工具,实现低查重、高质量教材快速编写!
  • AI专著生成新利器!全方位评测,助你快速完成学术专著撰写
  • 人工智能应用- 扫地机器人:01.什么是机器人
  • 探秘AI专著生成:热门工具全解读,开启高效写作新体验
  • 【AI黑话日日新】什么是AI云原生?
  • 超实用AI教材生成攻略:掌握写作技巧,低查重难题轻松解决!
  • 赋能中国 “芯” 动力:万宝盛华基于 2026 年雇佣前景洞察的芯片半导体人才解决方案 - 速递信息
  • 来个文艺马年吧,欢迎HarmonyOS5/6用户体验鸿蒙智能体!
  • AI专著生成神器来袭!专业工具助力,让专著撰写变得简单
  • See_you_soonの学习笔记之图论大合集(二)
  • 三、Claude Opus 4.6 谈Transformer与人类思考模式的差异性
  • AI教材编写秘籍大公开!低查重AI写教材工具让内容输出又快又好
  • 别再苦熬写专著!AI专著撰写工具,快速产出高质量学术成果
  • AI专著生成大揭秘:热门工具大比拼,快速产出高质量专著
  • NMN有副作用吗?当行业还在争论安全性,奥本元Aoisao已率先开启2.0高吸时代! - 资讯焦点
  • 天猫超市购物卡回收变现攻略:快速、安全的变现技巧 - 团团收购物卡回收
  • AI专著撰写不用愁!精选工具推荐,让专著写作事半功倍
  • 远健中油启动新春专项拨款,张健董事长向全体云家人发放“新春拨款” - 速递信息
  • 真的太省时间 9个降AI率网站深度测评与推荐
  • 掌握AI专著撰写技巧,实用工具分享,轻松打造专业学术作品
  • 乐山本地甜皮鸭推荐排名榜,首选吉太太 - 速递信息
  • 投影仪画面歪了?4 种投影方式一键调整,吊装也能轻松调正
  • 找口碑不错的智能新零售平台?2026年热门排行速看,OMO模式电商零售/数字化商品交易/价值共享电商零售,零售系统有哪些 - 品牌推荐师
  • 一键速查!联想 /motorola 手机保修期查询方法超简单
  • 学术专著不愁写!AI专著写作工具推荐,节省大量创作时间
  • 2026最新!B端宠物智能舱采购指南,选便捷实用的实力品牌 - 速递信息
  • 垃圾分类小程序|基于java+ vue垃圾分类小程序系统(源码+数据库+文档)
  • BEIT模型
  • 少走弯路:千笔ai写作,本科生论文救星!
  • 14:【Git】fatal: not a git repository git init正确姿势