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);
}

  

  

  

posted @   杰_森  阅读(516)  评论(0编辑  收藏  举报
编辑推荐:
· .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 三十六、最好用的懒加载
点击右上角即可分享
微信分享提示