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


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 相关文章推荐
js通过googleAIP翻译PHP系统的语言配置的实现代码
Oct 17 Javascript
javascript针对DOM的应用分析(三)
Apr 15 Javascript
简单实用的全选反选按钮例子
Oct 18 Javascript
JavaScript+CSS控制打印格式示例介绍
Jan 07 Javascript
js实现(全选)多选按钮的方法【附实例】
Mar 30 Javascript
jQuery中值得注意的trigger方法浅析
Dec 12 Javascript
vue2.0在table中实现全选和反选的示例代码
Nov 04 Javascript
vue 虚拟dom的patch源码分析
Mar 01 Javascript
Vue 项目分环境打包的方法示例
Aug 03 Javascript
JS 数组随机洗牌的实例代码
Sep 12 Javascript
Threejs实现滴滴官网首页地球动画功能
Jul 13 Javascript
vue treeselect获取当前选中项的label实例
Aug 31 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数组应该有多大的分析
2009/07/30 PHP
php自动加载的两种实现方法
2010/06/21 PHP
PHP入门经历和学习过程分享
2014/04/11 PHP
详解PHP的Yii框架中扩展的安装与使用
2016/04/01 PHP
PHP多个图片压缩成ZIP的方法
2020/08/18 PHP
网上应用的一个不错common.js脚本
2007/08/08 Javascript
显示js对象所有属性和方法的函数
2009/10/16 Javascript
JavaScript实用技巧(一)
2010/08/16 Javascript
js函数的引用, 关于内存的开销
2012/09/17 Javascript
基于jquery库的tab新形式使用
2012/11/16 Javascript
extjs 04_grid 单击事件新发现
2012/11/27 Javascript
javascript数组去重小结
2016/03/07 Javascript
拥有一个属于自己的javascript表单验证插件
2016/03/24 Javascript
从parcel.js打包出错到选择nvm的全部过程
2018/01/23 Javascript
深入了解JavaScript 的 WebAssembly
2019/06/15 Javascript
你不可不知的Vue.js列表渲染详解
2019/10/01 Javascript
angular共享依赖的解决方案分享
2020/10/15 Javascript
vue3.0封装轮播图组件的步骤
2021/03/04 Vue.js
Python中使用logging模块代替print(logging简明指南)
2014/07/09 Python
Python中集合类型(set)学习小结
2015/01/28 Python
Python+django实现文件下载
2016/01/17 Python
Linux上安装Python的PIL和Pillow库处理图片的实例教程
2016/06/23 Python
python 异常处理总结
2016/10/18 Python
Python实现的序列化和反序列化二叉树算法示例
2019/03/02 Python
关于tf.nn.dynamic_rnn返回值详解
2020/01/20 Python
美国受信赖的教育产品供应商:Nest Learning
2018/06/14 全球购物
linux面试题参考答案(7)
2012/10/29 面试题
新员工培训个人的自我评价
2013/10/09 职场文书
护理专业推荐信
2013/11/07 职场文书
伏羲庙导游词
2015/02/09 职场文书
2015年人力资源部工作总结
2015/04/30 职场文书
当幸福来敲门观后感
2015/06/01 职场文书
爱国教育主题班会
2015/08/14 职场文书
深入理解CSS 中 transform matrix矩阵变换问题
2021/08/30 HTML / CSS
Python selenium绕过webdriver监测执行javascript
2022/04/12 Python
苹果发布了MagSafe固件更新,可以不外接电源实现最高7.5W充电
2022/04/21 数码科技