• visibilitychange前端监测页面进入前台还是后台(页面最小化,开新菜单等)


    引入:https://www.html.cn/archives/6103

    考试系统的项目,页面需要做个定时器,考试结束前五分钟弹窗提示考试即将结束,考试时间到自动交卷

    一、碰到的问题

      1)因为考生可以搜索答案,所以考试页面可能会被最小化,或者在考试页面旁边新开一个窗口,鉴于浏览器的保护资源机制,页面在最小化或者不可见时资源会被释放,js脚本不会执行,windows系统可见定时器不走或者走得慢,苹果浏览器js停止

    二、解决方法

      使用visibilitychange事件,监听页面是在前台还是后台,进入后台清除定时器,进入前台启动定时器。

      visibilitychange事件有兼容性问题,以下代码为兼容处理,自测谷歌,360,ie11没有问题

      

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

      

      

      

  • 相关阅读:
    create-react-app搭建的项目中添加bootstrap
    用es6的Array.reduce()方法计算一个字符串中每个字符出现的次数
    为Docker配置阿里加速器,系统为Debian8
    基于Spring Boot,使用JPA动态调用Sql查询数据
    基于Spring Boot,使用JPA调用Sql Server数据库的存储过程并返回记录集合
    基于Spring Boot,使用JPA操作Sql Server数据库完成CRUD
    ES6,Array.includes()函数的用法
    【编程风格】c++命名约定
    【转】吴恩达的视频课程做成了文字版 ~~~
    【专业学习】常用的技术网站
  • 原文地址:https://www.cnblogs.com/deng-jie/p/14025028.html
Copyright © 2020-2023  润新知