Page Visibility API

我们先来看一个情况:我们生成一个定时器,给它10ms运行一次打印n然后n++,当n > 200时关闭定时器。

js 复制代码
function counter() {
    let n = 0;
    const timer = setInterval(() => {
        console.log(n);
        n++;
        if (n > 200) {
            clearInterval(timer);
        }
    }, 10);
}
counter();

可以看到效果也是很显而易见的,但是当我们在这个时候切换到别的页面的时候,定时器还会正常运行吗?我们来看一下。

会发现当我们切换到别的页面的时候这个定时器是1s运行一次的,这是因为浏览器对效率有优化,浏览器认为这个页面已经看不到了,那些复杂耗时计时操作就优化了一下,最快1s运行一次,这就会导致某些功能会异常。那我们该怎么办呢。

这时候就可以使用到一个API叫做Page Visibility API页面可见度API,这套API包含了一个事件和一个属性,我们来用一下。

事件我们去监听document,事件的名字叫做visibilitychange,当这个页面可见度发生变化的时候它就会运行这个事件。

js 复制代码
// 页面可见度API
document.addEventListener('visibilitychange', function () {
    console.log('页面可见度发生变化');
});

可以看到当我们切换到别的页面或者切换回来的时候这个事件都会调用一次,那我们怎么知道当前页面是显示还是隐藏的呢,我们可以通过一个属性document.hidden来知道,这是一个布尔属性,它为true的时候就表示当前页面是隐藏的,它为false的时候就表示当前页面是显示的。

js 复制代码
// 页面可见度API
document.addEventListener('visibilitychange', function () {
    if (document.hidden) {
        console.log('页面不可见了');
    } else {
        console.log('页面可见了');
    }
});

通过这个API就可以很好的去在切换页面的时候进行一些事件的触发,比如视频的播放或者小游戏的暂停等等。

考虑到一些兼容性的问题我们最好做一些判断,因为在老版本里面事件的名称和属性的名称有一些不一样,在IE浏览器里面事件的名称叫做msvisibilitychange,属性的名称叫做msHidden;在谷歌的老版本浏览器里面时间的名称叫做webkitvisibilitychange,属性的名称叫做webkitHidden

所以我们要处理这个事情也非常方便,定义两个变量,一个表示属性名hidden,一个表示事件名visibilitychange,如果document.hidden有值就说明浏览器支持visibilitychange事件,那么hidden变量的值就为hiddenvisibilitychange变量的值就为visibilitychange,以此类推。

js 复制代码
let hidden, visibilityChange;
if (typeof document.hidden !== "undefined") { // Opera 12.10 and Firefox 18 and later support  
    hidden = "hidden";
    visibilityChange = "visibilitychange";
} else if (typeof document.msHidden !== "undefined") {  // IE 9 and later support
    hidden = "msHidden";
    visibilityChange = "msvisibilitychange";
} else if (typeof document.webkitHidden !== "undefined") { // Chrome 13 and later support
    hidden = "webkitHidden";
    visibilityChange = "webkitvisibilitychange";
}
document.addEventListener(visibilityChange, function () {
    if (document[hidden]) {
        console.log('页面不可见了');
    } else {
        console.log('页面可见了');
    }
});
相关推荐
阳光是sunny18 分钟前
LangGraph实战教程:一文搞懂图的状态(State)管理
前端·人工智能·后端
whyfail31 分钟前
前端学 Spring Boot(5):从“你是谁”到“服务真的上线了”
前端·spring boot·后端
程序员黑豆1 小时前
鸿蒙开发:RelativeContainer相对布局组件实战——实现5个文本组件对齐
前端·华为·harmonyos
环境栈笔记1 小时前
高性价比指纹浏览器推荐与选型:如何对照价格和实际可用功能筛选候选
前端·人工智能·后端·自动化
hyf3266331 小时前
泛程序哪有想象中难!小白跟着走一遍就全懂
前端·爬虫·搜索引擎·seo·蜘蛛池
码农学院2 小时前
React公众号开发:母婴用品会员积分体系技术方案
前端·react.js·前端框架
路光.2 小时前
Vue2升级Vue3处理原 UMD/CommonJS 打包文件,不是标准 ESM
前端·javascript·vue.js·vue3
黄华SJ520it2 小时前
门店预约系统开发:提升服务行业数字化转型
前端·数据库·系统开发
一只月月鸟呀3 小时前
移动端tap与click的区别 && 点透事件
开发语言·前端·javascript
雪隐3 小时前
AI股票小助手10-我用代码管住自己的手:一个普通人的市场观察笔记
前端·人工智能·后端