js实现多个倒计时并行 js拼团倒计时
本文是对类似于拼团,多个商品每个都有各自的js倒计时,一开始接到接到这个需求也是头疼了一阵子,如果是在商品列表少的时候完全就可以写成死的,固定的变量,写几个定时器就ok了,
但是这次数据是活的,看一些拼团app都可以实现,既然能实现就搞起来,有了以下的想法 使用环境 vue
写一个准备渲染的死数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
data () { return { list: [ // 准备渲染的数据 { remainTime: 900000, // 距离结束还有多久 remainTimeStr: '' // 展示文案 }, { remainTime: 400000, remainTimeStr: '' }, { remainTime: 60500, remainTimeStr: '' }, ] } } |
百度copy一个倒计时的方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
countdowm (timestamp) { let self = this let timer = setInterval( function () { let nowTime = new Date() let endTime = new Date(timestamp) let t = endTime.getTime() - nowTime.getTime() if (t > 0) { let day = Math.floor(t / 86400000) let hour = Math.floor((t / 3600000) % 24) let min = Math.floor((t / 60000) % 60) let sec = Math.floor((t / 1000) % 60) hour = hour < 10 ? '0' + hour : hour min = min < 10 ? '0' + min : min sec = sec < 10 ? '0' + sec : sec let format = '' if (day > 0) { format = `${day}天${hour}小时${min}分${sec}秒` } if (day <= 0 && hour > 0) { format = `${hour}小时${min}分${sec}秒` } if (day <= 0 && hour <= 0) { format = `${min}分${sec}秒` } self.content = format } else { clearInterval(timer) self.content = 'over' } }, 1000) } |
捋清逻辑
首先, 根据逻辑对倒计时的方法进行更改,我们直接使用的就是距离结束还有多少时间的时间戳 ,我的思路是用一个定时器达到一个并行多个倒计时的思路,所以先将方法进行优化
- 不需要获取时间
- 也不需要一些时间计算
- 因为是多个倒计时并行 所以清楚定时器的逻辑需要进行更改
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
countdowm (timestamp) { let self = this let timer = setInterval( function () { let t = timestamp if (t > 0) { let day = Math.floor(t / 86400000) let hour = Math.floor((t / 3600000) % 24) let min = Math.floor((t / 60000) % 60) let sec = Math.floor((t / 1000) % 60) day = day < 10 ? '0' + day : day hour = hour < 10 ? '0' + hour : hour min = min < 10 ? '0' + min : min sec = sec < 10 ? '0' + sec : sec let format = '' format = `${day}天${hour}小时${min}分${sec}秒` self.content = format } else { // clearInterval(timer) self.content = 'over' } }, 1000) } |
简化完毕, 把自己刚才的思路带进方法内
图片轮播在定时器里 写一个循环 每次减少一秒 让当前数据内remainTime时间戳-1000
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
countdown () { let self = this let timer = setInterval( function () { for (let i = 0; i < self.list.length; i++) { self.list[i].remainTime -= 1000 let t = self.list[i].remainTime if (t > 0) { let day = Math.floor(t / 86400000) let hour = Math.floor((t / 3600000) % 24) let min = Math.floor((t / 60000) % 60) let sec = Math.floor((t / 1000) % 60) day = day < 10 ? '0' + day : day hour = hour < 10 ? '0' + hour : hour min = min < 10 ? '0' + min : min sec = sec < 10 ? '0' + sec : sec let format = '' format = `距离结束:<b>${day}</b> 天 <b>${hour}</b> 时 <b>${min}</b> 分 <b>${sec}</b> 秒` self.list[i].remainTimeStr = format } else { // 进行判断 如果数据内所有的倒计时已经结束,那么结束定时器, 如果没有那么继续执行定时器 let flag = self.list.every((val, ind) => val.remainTime <= 0) if (flag) clearInterval(timer) self.list[i].remainTimeStr = `距离结束:<b>00</b> 天 <b>00</b> 时 <b>00</b> 分 <b>00</b> 秒` // 结束文案 } } }, 1000) } |
这样 并行多个定时器就做好了, 但是发现了一个问题 当你切换路由的时候 发下你的定时器如果未结束 他还在执行,这样对性能造成了一些影响, 虽说用户看不到,但是也要解决,提高用户浏览体验
在你切换页面的时候 使用vue插件中的生命周期函数把数据更改为0 就ok
1
2
3
4
5
|
destroyed () { this .list.forEach((val) => { val.remainTime = 0 }) } |
js实现多个倒计时并行 js拼团倒计时的更多相关文章
- 倒计时的js实现 倒计时 js Jquery
by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=987 一.如火如荼的团 ...
- 利用moment为基础,基于DOM实现一个多个倒计时同时进行的js库方便使用
moment非常强大,提供了很多时间方法的封装,项目需要一个小倒计时的功能,网上找了很多不合适,决定自己写一个,直接上代码 //定义一个立即执行的函数(function () { var Ticts= ...
- 时分秒倒计时的js实现
示例: 剩余天数:08天02事02分02秒 html代码: <div id="timer" data-timer="20160628140203" sty ...
- 微信公众号 拼团到期人数不足 db触发器 js触发器 剥离
w注意当页面多个先后到期或同时到期的团时的用户体验 w保证了每次加载这个页面会是的过期的团不显示,马上到期的团会在页面存活期间进行页面更新和db操作: 但是这依赖了团状态值的更新必须依赖于有客户端页面 ...
- 团购类网站倒计时的js实现
一.如火如荼的团购网站 根据易观国际提供的统计数据,截至2010年6月,中国市场团购网站数量已经突破400家.国内团购潮从今年2月份开始出现,在4~6月出现高峰,尤其是今年5月,一些大的网站如爱帮网. ...
- js顺序加载与并行加载
前端优化过程中常提到js的加载方式,下面说下几种常用的加载方式: 1:head标签内插入<script>标签 <script type="text/javaScript&q ...
- 微信小程序 拼团商品倒计时(拼团列表、拼团商品详情)
直接上图: 拼团列表.拼团详情-倒计时 //单个倒计时,适用用于单个商品的倒计时 js文件: //倒计时 function cou ...
- node.js学习(二)--Node.js控制台(REPL)&&Node.js的基础和语法
1.1.2 Node.js控制台(REPL) Node.js也有自己的虚拟的运行环境:REPL. 我们可以使用它来执行任何的Node.js或者javascript代码.还可以引入模块和使用文件系统. ...
- js调用php和php调用js的方法举例
js调用php和php调用js的方法举例1 JS方式调用PHP文件并取得php中的值 举一个简单的例子来说明: 如在页面a.html中用下面这句调用: <script type="te ...
随机推荐
- 初次接触之R语言
一.什么是R? 最受欢迎的数据分析和可视化平台之一. 其他分析平台:Excel.SPSS.SAS 二.为什么选择R? 免费.支持WINDOWS/MAC OS/Linux. 开源
- thinkphp mysql查询结果为什么全是string问题
找到根目录下的thinkphp\library\think\db\Connection.php 文件 // PDO连接参数 protected $params = [ PDO::ATTR_CASE = ...
- CMS使用对应版本当作新项目。
document.form1 整体替换document.forms[0] document.Templetslist 整体替换document.forms[0] document.f_Upload整体 ...
- RabbitMQ in Action (2): Running and administering Rabbit
Server management the Erlang node and the Erlang application Starting nodes multiple Erlang applicat ...
- RevDebug -- VS 调试神器,你值得拥有!
1. What's RevDebug Don't debug - replay! Trace the root cause of bugs in a matter of seconds, save y ...
- OSGi类加载流程
思路 OSGi每个模块都有自己独立的classpath.如何实现这一点呢?是因为OSGi采取了不同的类加载机制: OSGi为每个bundle提供一个类加载器,该加载器能够看到bundle Jar文件内 ...
- [Swift]LeetCode289. 生命游戏 | Game of Life
According to the Wikipedia's article: "The Game of Life, also known simply as Life, is a cellul ...
- [Swift]LeetCode951. 翻转等价二叉树 | Flip Equivalent Binary Trees
For a binary tree T, we can define a flip operation as follows: choose any node, and swap the left a ...
- [Swift]LeetCode1006. 笨阶乘 | Clumsy Factorial
Normally, the factorial of a positive integer n is the product of all positive integers less than or ...
- Python档案袋(函数与函数装饰器 )
特点:代码复用.可扩展.保持一致性 函数简单的实现,返回值的不同: #定义方法 def funx1(): pass def funx2(): return 0 def funx3(): return ...