当前位置: 首页 > news >正文

常州住房和城乡建设局网站首页宣传片拍摄手法及技巧

常州住房和城乡建设局网站首页,宣传片拍摄手法及技巧,设计色彩的门户网站模板,汕头免费做网站背景 最近在做一个倒计时时,发现当切换浏览器tab后,再切回倒计时页面,倒计时的数据不准,比真正的剩余时间多,短时间还好,时间长了,计时器的误差会很大。 原因 倒计时是用setInterval每1000毫…

背景

最近在做一个倒计时时,发现当切换浏览器tab后,再切回倒计时页面,倒计时的数据不准,比真正的剩余时间多,短时间还好,时间长了,计时器的误差会很大。

原因

倒计时是用setInterval每1000毫秒触发一次。

在进入页面时,计算剩余时间,把剩余时间用setInterval每1000毫秒触发一次进行减法。

但是由于浏览器的优化机制,为了更极致的优化,在切换tab之后浏览器会把setInterval的执行效率降低,在浏览器窗口非激活的状态下会停止工作或者以极慢的速度工作。那么这时候就不是1000毫秒减一次了,所以会有误差。

用setInterval实现计时

var start = new Date().getTime(), count = 0;
var interval = setInterval(function () {count++console.log(new Date().getTime() - (start + count * 1000) + 'ms')if(count == 10){clearInterval(interval);}
}, 1000)

image.png

可以看到,我打印的new Date().getTime() - (start + count * 1000) ,
也就是每次计时的误差,理想情况下,应该是0。

用setTimeout实现计时

var start = new Date().getTime(), count = 0,interval = 1000;
var timer = setTimeout(doFunc,interval);
function doFunc(){count++console.log(new Date().getTime() - (start + count * 1000) + 'ms');if(count < 10){timer = setTimeout(doFunc,interval);}
}

image.png

也是一样的会出现误差

setInterval、setTimeout误差的不同之处

setInterval指定的是“开始执行”之间的间隔,并不考虑每次任务执行本身所消耗的时间。因此实际上,两次执行之间的间隔会小于指定的时间。比如,setInterval指定每 100ms 执行一次,每次执行需要 5ms,那么第一次执行结束后95毫秒,第二次执行就会开始。如果某次执行耗时特别长,比如需要105毫秒,那么它结束后,下一次执行就会立即开始。

为了确保两次执行之间有固定的间隔,可以不用setInterval,而是每次执行结束后,使用setTimeout指定下一次执行的具体时间。

模拟阻塞事件

setInterval

//阻塞代码
setInterval(function () {var n = 0while (n++ < 1000000000);
}, 1000)var start = new Date().getTime(), count = 0;
var interval = setInterval(function () {count++console.log(new Date().getTime() - (start + count * 1000) + 'ms')if(count == 10){clearInterval(interval);}
}, 1000)

image.png

setTimeout

//阻塞代码
setInterval(function () {var n = 0while (n++ < 1000000000);
}, 1000)var start = new Date().getTime(), count = 0,interval = 1000;
var timer = setTimeout(doFunc,interval);
function doFunc(){count++console.log(new Date().getTime() - (start + count * 1000) + 'ms');if(count < 10){timer = setTimeout(doFunc,interval);}
}

image.png

可以看到加了一些阻塞线程的代码后,误差越来越严重,
在实际项目中,执行计时器的同时,会有很多其他异步阻塞事件,会导致倒计时功能不精确。

解决方案

1、setInterval每次触发的时候,重新计算剩余时间(误差在一分钟以内)

2、Web Workers(这个在nuxt中引入会报错,涉及到webpack改动较大,暂时不用)

3、进行误差修正,也就是获取到误差的值,并且根据这个误差值来动态调整我们执行回调的间隔时间

  • 计算误差值
  • 动态调整执行setTimeout的间隔

加上动态误差修正

var start = new Date().getTime(), count = 0,interval = 1000;
var offset = 0;//误差时间
var nextTime = interval - offset;//原本间隔时间 - 误差时间
var timer = setTimeout(doFunc,nextTime);
function doFunc(){count++console.log(new Date().getTime() - (start + count * interval) + 'ms');offset = new Date().getTime() - (start + count * interval);nextTime = interval - offset;if (nextTime < 0) { nextTime = 0; }if(count < 10){timer = setTimeout(doFunc,nextTime);}
}

试试效果:

image.png

把每次的nextTime打印出来看看:

image.png

以看到每次的nextTime都会根据上次的误差值来动态调整,以尽量减少整体的误差。

http://www.yayakq.cn/news/683090/

相关文章:

  • 玩具网站开发背景网址制作公司
  • 家居网站建设咨询社交网站做强
  • 蓝杉互动网站建设个人网站 不用备案吗
  • 什么是二级网站推广营销图片素材
  • 漳浦网站开发企业网站推广定义
  • 怎么做才能让网站人气提升页面设计公司排名前十
  • 淘宝联盟优惠券网站建设虚拟主机安装网站
  • 手机网站制作中设计本家装
  • 网站制作比较好的公司电商小程序价格
  • 必须做网站等级保护工程建设游戏
  • 合适的网站建设的公司怎么找做网站时怎么裁切存图
  • 网站建设用素材seo培训
  • 免费的网站app下载青岛品牌
  • 深圳市路桥建设集团有限公司招标采购网站wordpress发布文章页面错误
  • 专门做衣服特卖的网站有哪些做网站怎么推广收益大
  • 网站建设的费用是多少购物平台推广如何赚钱
  • 改版百度不收录网站国外有哪些网站可以做电商
  • 企业网站优化设计应该把什么放在首位软件开发文档包括什么内容
  • 做一个电影网站需要多少钱乡村建设规划网站
  • 网站建设公司画册莱芜seo公司
  • 专业seo站长工具网站建设一意见
  • 易思企业网站管理免费网站电视剧下载
  • 做网站的感觉合肥企业网站制作方案
  • 哪里创建免费个人网站scorilo wordpress
  • 洛阳最好的做网站的公司哪家好域名备案需要多久
  • 网站推广新手教程网站建设的功能需求分析
  • dede淘宝客网站模板建设贷款网站哪家好
  • 网站营销的特征有泰州企业网站建设公司
  • 吉林省住房建设安厅网站旺店通erp系统
  • 苏州相城做网站哪家好红色好看的网站