JS关于定时器setInterval不准问题,在移动端手机息屏时停止在pc上会变慢的问题

JS关于定时器setInterval不准问题,在移动端手机息屏时停止在pc上会变慢的问题

定时器不准的原因:

PC——大多数浏览器都会自动把未激活页面中的JS定时器(setTimeout、setInterval)间隔最小值改为1秒以上。这是因为间隔很小的定时器一般用来做UI更新(比如定时更新动画),但是在后台运行的定时器(用户看不见的页面)会变慢,这样既节省资源有不影响用户体验。
移动端(H5)——内存、CPU、带宽等资源更加宝贵,移动设备上的浏览器往往会直接冻结所有未激活页面上的所有定时器。

解决方法

思路:我们可以先记录刚开始倒计时的时间(this.startCountTime = Date.now())
当手机息屏或在后台运行时(visibilitychange事件监听)清除定时器,当页面恢复可见状态时
实际倒计时时间 = 当前时间 - 开始倒计时的时间然后再用需要倒计时的时间减去实际倒计时时间的值大于0时继续倒计时这个差值,小于0就结束倒计时
注意添加了visibilitychange事件记得清除

代码(vue):

data(){
	return:{
		defaultTime:5//倒计时时间(分钟)
	}
}
mounted(){
   document.addEventListener('visibilitychange',this.visibilitychange)
},
methods:{
        visibilitychange(){
            let vm = this
            if(document.hidden){
                console.log("手机息屏或离开该程序");
                clearInterval(vm.timeId)
            }else{
                console.log('恢复页面');
                let second2 =  Math.floor((Date.now() - vm.startCountTime) /1000)                  			  
                let surplusTime = vm.defaultTime*60 -  second2  
                if(surplusTime>0){
                    console.log('继续倒计时',surplusTime);
                    vm.startInterval(surplusTime)
                }else{
                    console.log('恢复页面倒计时结束');
                }
            }
        },
        // 开始倒计时(秒)
        startInterval(num){
            let vm = this
            vm.timeId = setInterval(() => {
                vm.time = num--
                    if(num < 0 ){
                        console.log('倒计时结束');
                        clearInterval(vm.timeId)
                        return
                    }
            }, 1000);
        },
}
beforeDestroy(){
        clearInterval(this.timeId)
        document.removeEventListener('visibilitychange',this.visibilitychange)

 },

这样就基本上解决定时器不准的问题了。
如果各位有更好的方法或者有bug也可以留言交流一下,互相学习!

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值