visibilitychange前端监测页面进入前台还是后台(页面最小化,开新菜单等)
引入:https://www.html.cn/archives/6103
考试系统的项目,页面需要做个定时器,考试结束前五分钟弹窗提示考试即将结束,考试时间到自动交卷
一、碰到的问题
1)因为考生可以搜索答案,所以考试页面可能会被最小化,或者在考试页面旁边新开一个窗口,鉴于浏览器的保护资源机制,页面在最小化或者不可见时资源会被释放,js脚本不会执行,windows系统可见定时器不走或者走得慢,苹果浏览器js停止
二、解决方法
使用visibilitychange事件,监听页面是在前台还是后台,进入后台清除定时器,进入前台启动定时器。
visibilitychange事件有兼容性问题,以下代码为兼容处理,自测谷歌,360,ie11没有问题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | function getHiddenProp() { var prefixes = [ 'webkit' , 'moz' , 'ms' , 'o' ]; // if 'hidden' is natively supported just return it if ( 'hidden' in document) return 'hidden' ; // otherwise loop over all the known prefixes until we find one for ( var i = 0; i < prefixes.length; i++) { if ((prefixes[i] + 'Hidden' ) in document) return prefixes[i] + 'Hidden' ; } // otherwise it's not supported return null ; } function getVisibilityState() { var prefixes = ['webkit ', ' moz ', ' ms ', ' o ']; if (' visibilityState ' in document) return ' visibilityState '; for (var i = 0; i < prefixes.length; i++) { if ((prefixes[i] + ' VisibilityState ') in document) return prefixes[i] + ' VisibilityState '; } // otherwise it' s not supported return null ; } function isHidden() { var prop = getHiddenProp(); if (!prop) return false ; return document[prop]; } // use the property name to generate the prefixed event name var visProp = getHiddenProp(); if (visProp) { var evtname = visProp.replace(/[H|h]idden/, '' ) + 'visibilitychange' ; document.addEventListener(evtname, function () { console.log(document[getVisibilityState()]) if (document[getVisibilityState()] == 'hidden' ){ console.log( "页面进入后台" ) } else { console.log( "页面进入前台" ) } }, false ); } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
2018-11-23 三十六、fetch
2018-11-23 三十六、最好用的懒加载