微信小程序 倒计时组件实现代码


Posted in Javascript onOctober 24, 2016

功能: 适用于电商应用的限时团购、商品秒杀等

先来看下最终效果:

微信小程序 倒计时组件实现代码

git源:http://git.oschina.net/dotton/CountDown

分步骤-性子急的朋友,可以直接看最后那段代码。

wxml文件放个text

<text>second: {{second}} micro second:{{micro_second}}</text>

在js文件中调用

function countdown(that) {
 var second = that.data.second
 if (second == 0) {
  // console.log("Time Out...");
  that.setData({
   second: "Time Out..."
  });
  return ;
 }
 var time = setTimeout(function(){
  that.setData({
   second: second - 1
  });
  countdown(that);
 }
 ,1000)
}

Page({
  data: {
    second: 3
  },
  onLoad: function() {
    countdown(this);
  }
});

运行验证下,从10走到1s,然后显示时间到。

于是继续将毫秒完善,注意毫秒的步长受限于系统的时间频率,于是我们精确到0.01s即10ms

js

/* 秒级倒计时 */
function countdown(that) {
 var second = that.data.second
 if (second == 0) {
  that.setData({
   second: "Time out!",
   micro_second: "micro_second too."
  });
  clearTimeout(micro_timer);
  return ;
 }
 var timer = setTimeout(function(){
  that.setData({
   second: second - 1
  });
  countdown(that);
 }
 ,1000)
}

/* 毫秒级倒计时 */
// 初始毫秒数,同时用作归零
var micro_second_init = 100;
// 当前毫秒数
var micro_second_current = micro_second_init;
// 毫秒计时器
var micro_timer;

function countdown4micro(that) {
 if (micro_second_current <= 0) {
  micro_second_current = micro_second_init;
 }
 micro_timer = setTimeout(function(){
  that.setData({
   micro_second: micro_second_current - 1
  });
  micro_second_current--;
  countdown4micro(that);
 }
 ,10)
}

Page({
  data: {
    second: 2,
    micro_second: micro_second_init
  },
  onLoad: function() {
    countdown(this);
    countdown4micro(this);
  }
});

wxml文件

<text style="display: block;">second: {{second}}s</text>

<text>{{micro_second}}</text>

如此,当秒级运行完毕时,毫秒级timer即clearTimeout,并将字本显示为'micro_second too'

再添加一个countdown4micro方法,使得显示剩余 0:3:19 89这样形式的倒数

function dateformat(second) {
  var dateStr = "";
  var hr = Math.floor(second / 3600);
  var min = Math.floor((second - hr * 3600) / 60);
  var sec = (second - hr * 3600 - min * 60);// equal to => var sec = second % 60;
  dateStr = hr + ":" + min + ":" + sec;
  return dateStr;
}
目前有2个时钟,影响性能,合并下去掉countdown,于是countdown4micro变成以下的样子:

function countdown4micro(that) {

  var loop_second = Math.floor(loop_index / 100);
  // 得知经历了1s
  if (cost_micro_second != loop_second) {
    // 赋予新值
    cost_micro_second = loop_second;
    // 总秒数减1
    total_second--;

  }
   // 每隔一秒,显示值减1; 渲染倒计时时钟
  that.setData({
   clock:dateformat(total_second - 1)
  });

   if (total_second == 0) {
    that.setData({
     // micro_second: "",
     clock:"时间到"
    });
    clearTimeout(micro_timer);
    return ;
   }  

 if (micro_second_current <= 0) {
  micro_second_current = micro_second_init;
 }
 micro_timer = setTimeout(function(){
  that.setData({
   micro_second: micro_second_current - 1
  });
  micro_second_current--;
  // 放在最后++,不然时钟停止时还有10毫秒剩余
  loop_index ++;
  countdown4micro(that);
 }
 ,10)
}

如此这般,毫秒与时分秒是分别运行渲染的,再次改造,程序可读性更好。dateformat针对于毫秒操作,而不接受秒为数。同时还省却了计算100次为1s的运算

/** 
 * 需要一个目标日期,初始化时,先得出到当前时间还有剩余多少秒
 * 1.将秒数换成格式化输出为XX天XX小时XX分钟XX秒 XX
 * 2.提供一个时钟,每10ms运行一次,渲染时钟,再总ms数自减10
 * 3.剩余的秒次为零时,return,给出tips提示说,已经截止
 */

// 定义一个总毫秒数,以一分钟为例。TODO,传入一个时间点,转换成总毫秒数
var total_micro_second = 2 * 1000;

/* 毫秒级倒计时 */
function countdown(that) {
   // 渲染倒计时时钟
   that.setData({
     clock:dateformat(total_micro_second)
   });

   if (total_micro_second <= 0) {
     that.setData({
       clock:"已经截止"
     });
     // timeout则跳出递归
     return ;
   }  
   setTimeout(function(){
    // 放在最后--
    total_micro_second -= 10;
    countdown(that);
  }
  ,10)
}

// 时间格式化输出,如3:25:19 86。每10ms都会调用一次
function dateformat(micro_second) {
   // 秒数
   var second = Math.floor(micro_second / 1000);
   // 小时位
   var hr = Math.floor(second / 3600);
   // 分钟位
   var min = Math.floor((second - hr * 3600) / 60);
   // 秒位
  var sec = (second - hr * 3600 - min * 60);// equal to => var sec = second % 60;
  // 毫秒位,保留2位
  var micro_sec = Math.floor((micro_second % 1000) / 10);
  return hr + ":" + min + ":" + sec + " " + micro_sec;
}

Page({
  data: {
    clock: ''
  },
  onLoad: function() {
    countdown(this);
  }
});

经过如上优化,代码量减少一半,运行效率也高了。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
关于 byval 与 byref 的区别分析总结
Oct 08 Javascript
JavaScript DOM学习第一章 W3C DOM简介
Feb 19 Javascript
JQ选择器_选择同类元素的第N个子元素的实现方法
Sep 08 Javascript
Javascript 使用ajax与C#获取文件大小实例详解
Jan 13 Javascript
jQuery插件FusionCharts绘制的3D环饼图效果示例【附demo源码】
Apr 02 jQuery
Ajax验证用户名或昵称是否已被注册
Apr 05 Javascript
jQuery实现动态删除LI的方法
May 30 jQuery
jquery基于layui实现二级联动下拉选择(省份城市选择)
Jun 20 jQuery
react路由配置方式详解
Aug 07 Javascript
vue 添加vux的代码讲解
Nov 30 Javascript
如何更好的编写js async函数
May 13 Javascript
Vue中在新窗口打开页面及Vue-router的使用
Jun 13 Javascript
微信小程序 WXDropDownMenu组件详解及实例代码
Oct 24 #Javascript
微信小程序 购物车简单实例
Oct 24 #Javascript
Select2.js下拉框使用小结
Oct 24 #Javascript
微信小程序 绘图之饼图实现
Oct 24 #Javascript
用jmSlip编写移动端顶部日历选择控件
Oct 24 #Javascript
微信小程序 富文本转文本实例详解
Oct 24 #Javascript
微信小程序 参数传递详解
Oct 24 #Javascript
You might like
PHP+AJAX实现无刷新注册(带用户名实时检测)
2007/01/02 PHP
PHP中遍历stdclass object的实现代码
2011/06/09 PHP
php防止sql注入代码实例
2013/12/18 PHP
PHP字符串的递增和递减示例介绍
2014/02/11 PHP
php json转换成数组形式代码分享
2014/11/10 PHP
在 IE 中调用 javascript 打开 Excel 表
2006/12/21 Javascript
IE 上下滚动展示模仿Marquee机制
2009/12/20 Javascript
Javascript的匿名函数小结
2009/12/31 Javascript
jQuery开发者都需要知道的5个小技巧
2010/01/08 Javascript
谈谈AngularJs中的隐藏和显示
2015/12/09 Javascript
IScroll5 中文API参数说明和调用方法
2016/05/21 Javascript
bootstrap+jQuery 实现下拉菜单中复选框全选和全不选效果
2017/06/12 jQuery
angular基于ng-alain定义自己的select组件示例
2018/02/23 Javascript
vue中手机号,邮箱正则验证以及60s发送验证码的实例
2018/03/16 Javascript
在Vue mounted方法中使用data变量详解
2019/11/05 Javascript
微信jssdk踩坑之签名错误invalid signature
2020/05/19 Javascript
微信小程序 scroll-view的使用案例代码详解
2020/06/11 Javascript
vue实现点击按钮“查看详情”弹窗展示详情列表操作
2020/09/09 Javascript
django定期执行任务(实例讲解)
2017/11/03 Python
解决pandas 作图无法显示中文的问题
2018/05/24 Python
Matplotlib.pyplot 三维绘图的实现示例
2020/07/28 Python
python爬虫看看虎牙女主播中谁最“顶”步骤详解
2020/12/01 Python
解决pytorch 的state_dict()拷贝问题
2021/03/03 Python
利用纯CSS3实现动态的自行车特效源码
2017/01/20 HTML / CSS
英国历史最悠久的DJ设备供应商:DJ Finance、DJ Warehouse、The DJ Shop
2019/09/04 全球购物
往来会计岗位职责
2013/12/19 职场文书
大学生职业规划前言模板
2013/12/27 职场文书
网络维护中文求职信
2014/01/03 职场文书
市场营销专业大学生职业生涯规划文
2014/03/06 职场文书
服务承诺书怎么写
2014/05/24 职场文书
培训科主任岗位职责
2014/08/08 职场文书
硕士毕业论文导师评语
2014/12/31 职场文书
大雁塔英文导游词
2015/02/10 职场文书
广播稿:校园广播稿范文
2019/04/17 职场文书
使用Navicat Premium工具将oracle数据库迁移到MySQL
2021/05/27 Oracle
Python Pandas常用函数方法总结
2021/06/15 Python