关于移动端浏览器定时器后台停止运行的问题

本文探讨了在移动端浏览器中定时器在后台停止运行的问题。在微信浏览器的商城项目中,作者发现页面锁屏或后台运行时定时器暂停。为解决此问题,利用PageVisibility API的`visibilityState`和`hidden`属性,通过`visibilitychange`事件监听页面可见性变化,实现后台运行时暂停定时器,前台恢复时继续执行。这种方法适用于安卓和iOS设备,能有效控制页面资源和提高用户体验。

关于移动端浏览器定时器后台停止运行的问题

今天在做微信浏览器端的商城项目的时候遇到了一个问题,具体场景是这样的:在页面添加了一个定时器,某项数据每秒递减,当手机锁屏或者后台运行时再返回页面,发现定时器在后台运行时停止了,返回才继续开始运行。

解决方法:
这里我是用的是一个H5的一个PageVisibility API,在这里,我们可以得到两个属性及其参数,用来表示当前页面是否可见:

  • document.visibilityState:hidden/visiable/preview
  • document.hidden:true/false

对于我的问题,我是这样解决的

document.addEventListener('visibilitychange',function() {
    if(document.visibilityState=='visible') {
        location.reload(true);
    }
})
document.addEventListener('webkitvisibilitychange',function() {
    if(document.webkitVisibilityState=='visible') {
        location.reload(true);
    }
})
document.addEventListener('mozvisibilitychange',function() {
    if(document.mozVisibilityState=='visible') {
        location.reload(true);
    }
})
document.addEventListener('msvisibilitychange',function() {
    if(document.msVisibilityState=='visible') {
        location.reload(true);
    }
})

以上虽然是兼容写法,但这种新特性不太适合旧版本的浏览器,对于移动端可以放心使用,安卓/iOS测试通过。
意思是,通过visibilitychange事件监听当前页面可见性的变化,当前页面可见时,页面刷新,我就可以从后台拿到最新数据,当然,如果不想从后台拿数据,你可以这么办:

document.addEventListener('visibilitychange',function() {
        var d = new Date();
        var b = 0;
        if(document.visibilityState=='hidden') {
            b = Math.floor(d.getTime()/1000);
        }else {
            screenCloseTime = Math.floor((d.getTime() - b)/1000);
        }
    })

这样你就拿到了页面关闭了的时间,然后在页面打开时补上页面时间差。
需要注意的是安卓和iOS的情况可能不一样,需要分设备对待。

说到这个新特性,我们可以很容易的想到他的应用场景,比如:你想控制页面的动画在页面隐藏时暂停,返回时继续;也可以在页面不显示的时候,暂缓一些不必要的操作,可以达到减少客户端、服务端压力的目的等。总之,这个特性在某些场景下还是非常实用的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值