js应用Date对象实现即时刷新时间。

前言:经常在网站上看到会有一个时间显示,有兴趣的可以跟着着一个简单的功能。

 首先,我们基本的想法,肯定是要使用Date对象吧。所以我们先new一个。
复制代码

当然,光有这个还不行,我们得,把我们需要数据取出来,为了便于观察实时的效果,我们就用date.getSeconds();这条数据。这个是用来显示秒数的。
复制代码

我们来看看它的效果

这样我们就做到了基本的显示。当然,这样可不行。我们需要的是一个实时的。怎么做?当然是要用到定时器setInterval啦。 把定时器的时间间隔设置为1000毫秒,我们来试一试。 代码如下:

这里我们用到了Dom的操作,不会的可以去学习学习,我们先写了一个h1标签,用document.getElementById('time')获取到了h1元素。然后通过innerHtml设置了元素中的内容。 我们来看看效果。

我们继续等待一秒以后

发现了什么,竟然没有刷新。我们想来检查问题。 第一个就想到的是定时器没有起作用,虽然这种可能性很小。我们打开控制台,查看h1元素。

发现h1元素每隔一秒,跳动一次,那么基本排除了是定时器的问题。那么就只可能是date.getSeconds();的问题了。很明显date.getSeconds();在运行过程中是一个固定值。打开consol

果然如此,那么为什么获取的date.getSeconds();不是实时的呢,细心的可能已经发现了。我们先来看w3c对Date对象的描述

Date 对象会自动把当前日期和时间保存为其初始值。什么是初始值?初始值就是固定值。 那么怎么让它能够改变呢,我们就需要每次刷新都需要重新去获取一下Date对象了。 代码如下。

我们把Date对象初始化放在定时器的回调函数内部,这样我们就在可以执行定时器的同时初始化Date对象。 效果如下:

一段时间后;

最后,我们最好新建一个方法,将初始化代码与定时器分开。这样有助于我们对于代码的可读性和可操作性。

最后我们思考一下,我们获取的真的是准确的时间吗?答案肯定不是的,原因在于多方面的,第一,我们在new Date对象时获取的秒数不一定是这一秒的刚开始,有可能是中间,有可能是已经快结束了。这样就造成了很大的误差。 第二,我们都知道,定时器在工作时,因为setTimeout,setInterval是异步任务,调用之后不会直接进入执行栈,而是进入任务队列,所以只有等到当前执行栈没有其他操作,它们才会进入执行栈中执行。所以会存在一定误差。 以上就是此次对于时间刷新的一些学习,希望看到的人有一些收获。共勉。

猜你喜欢

转载自juejin.im/post/5b5bddeae51d45199460022a