故事背景:按照惯例,先写下故事背景,其实也是再次汇报下最近开发情况的。做电商的都知道,这是个活动季啊,双十一、双十二、元旦。。。。各种啊。。其实说这么多就是想表达最近比较忙。呵呵^_^,正好今天抽点空来我最爱的网站写点自己喜欢的和大家分享下。

  还是之前按之前所说,插件源于开发需求。正好最近项目中需要用到计时器和预加载图片功能,本人心血来潮,决定整个插件封装一下,即满足了项目的需要,也满足自己的爱好啊,算是一举两得吧^^。其实写插件的时候要考虑到很多,因为公共的东西,如果出错,那后果会影响很大。毕竟不是一个地方用。所以,开发插件的时候一定要考虑全面。经过N次自测和他测,然后再使用。也就是我之前所说的,好的插件源于测试。经不起测试的插件,那就是个大坑啊。相信不少程序猿同仁被坑过啊。说多了都是泪啊。。。。所以现在的我是能不用第三方的坚决不用,就算麻烦也要自己去写。。。

  额。。好像又扯多了,这里就是程序猿网上的家啊,到了家里就是能说,一不小心就说多了。。。好了,开始本次插件系列开发的正题吧。

  故事经过:本次开发的插件是countdown(倒计时),这个是个小插件,可能都是大家看不起眼的插件。呵呵,也许吧。功能的确简单。但是可扩展性可是很强的啊,例如,如果一个页面上有多个这样的倒计时,(例如淘宝页面的商品倒计时)难不成要写多次?当然不是这样。大部分的倒计时都是用window.setInterval实现的。使用window.setInterval就会涉及到关闭计时器的动作。这个动作也是很多人常常会漏掉的,希望大家养成良好习惯,及时关闭计时器。否则会给页面带来很大开销。更何况如果一个页面有很多个这样的计时器,例如淘宝的限时促销活动。一个页面可能有几十个倒计时器,如果在结束时候不关闭,那么这样的影响就很大了。所以,猿们,我们得养成好习惯啊。得像狮学习啊。^_^

  其实当一个页面有未知个数的倒计时的时候,那么我们就要专门去控制关闭了,而不是那么简单的clearInterval("...");了。所以,一个看似简单的倒计时,只要你肯挖掘里面的需求,其实也不是那么简单。当然喽,也不是很复杂了。

  先说下本倒计时的功能吧。1、支持同一个页面多个倒计时;2、倒计时结束后,能自动释放计时器;

  看过我之前写的插件开发系列的都知道我写插件的规范,或者说是习惯吧。老样子,开发插件分三步走:

  第一步:定义插件和参数  var countdown= function () {this.defaultParams = {};};

  第二步:定义插件属性、方法    countdown.prototype = {constructor: countdown,init:function (params){}};

  第三步:对外分装  $.countdown= new countdown();

  这里在啰嗦两句,为啥老是这样写呢,首先,做任何事情都要按“步骤”来,这里不是说要按部就班啥的,是一种自己看好的习惯,也算是我个人理解的一个规范吧。第二,这样写思路很清晰,目的也很明确,剩下的只需要你去填充就行了。当然了,每个插件的内部实现都是不一样的,难易不一,这个只能算个框架,或是说思路吧。

  这篇博文写了很久,主要是忙了一段时间忘记了,今天又拿出来,补上吧。算是给自己一点安慰吧,一般我不喜欢拖着一件事情的,尤其是自己喜欢的事情。^_^

  好了,该是贴代码的时刻了,哈哈  

 /*
* instructions :countdown
* date : 2014-10-26
* author : 张文书
* Last Modified 2014-10-17
* By 张文书
*/
$(function () {
///说明:
/// 倒计时
var countdown = function () {
this.defaults = {
endDateTime: "",//结束时间 格式"yyyy-MM-dd HH:mm:ss"
currentDateTime: "",//服务器当前时间 格式"yyyy-MM-dd HH:mm:ss" remainDaysId: "",//剩余天 ID
remainHoursId: "",//剩余小时 ID
remainMinutesId: "",//剩余分钟 ID
remainSecondsId: "", //剩余秒钟 ID
countDownName: "", //倒计时器名称
difference: 0 //时间间隔(无需赋值,只做接收)
};
this.options = {};
};
countdown.prototype = {
constructor: countdown,
init: function (params) {
this.options = $.coverObject(this.defaults, params);
this._initCountdown();
},
_initCountdown: function () {
this.options.difference = this.getDifference();
var options = this.options;
this.options.countDownName = window.setInterval(function () {
countdown.prototype.getCountdownTime(options);
}, 1000);
},
//说明:
// 返回结束时间和当前服务器时间的差值
getDifference: function () {
var endDateTime = this.convertStrToDate(this.options.endDateTime);//设置结束时间
var endTime = endDateTime.getTime();//定义参数可返回距 1970 年 1 月 1 日之间的毫秒数
var nowTime = this.convertStrToDate(this.options.currentDateTime);//当前时间
var difference = endTime - nowTime.getTime();//差值
return difference;
},
//说明:
// 获得并显示倒计时时间
getCountdownTime: function (options) {
options.difference = options.difference - 1000;
var nMS = options.difference;
var nD = Math.floor(nMS / (1000 * 60 * 60 * 24));//获得天数
var nH = Math.floor(nMS / (1000 * 60 * 60)) % 24;//获得小时
var nM = Math.floor(nMS / (1000 * 60)) % 60;//获得分钟
var nS = Math.floor(nMS / 1000) % 60;//获得秒钟
if (nMS < 0) {
clearInterval(options.countDownName);//停止
} else {
$("#" + options.remainDaysId).text(nD < 10 ? "0" + nD : nD);//显示天数
$("#" + options.remainHoursId).text(nH < 10 ? "0" + nH : nH);//显示小时
$("#" + options.remainMinutesId).text(nM < 10 ? "0" + nM : nM);//显示分钟
$("#" + options.remainSecondsId).text(nS < 10 ? "0" + nS : nS);//显示秒钟
}
},
//说明:
// 将字符串转成时间类型
convertStrToDate: function (strDate) {
var date = eval('new Date(' + strDate.replace(/\d+(?=-[^-]+$)/, function (a) { return parseInt(a, 10) - 1; }).match(/\d+/g) + ')');
return date;
}
};
$.countdown = new countdown();
});

  代码很简单,而且都有我开发的时候写的注释(我个人有写注释的习惯,当然这些注释不光是写个我自己看的。我认为,写好注释也是一种团队意识的表现。记住:你写的代码最终不仅仅是为了给自己看。为啥我就不解释了,都懂^_^),代码我就不一一解释了,注意传递的参数,要传很多标签id。当然如果你有兴趣,可以将其封装在插件里,通过jquery输出到页面,这个也很简单。这里只是提供个意见。

  因为本来就是一个简单的功能,所以也就没有样式表了。如果有不清楚的园友,请随时联系我。当然,如果您有更好的意见,还请不吝赐教啊,如果有想共同探讨插件开发(或者其他)的同仁,随时联系我,QQ:296319075 ,注明园友就好,同时也希望大家也能提出宝贵意见。秉承共同探讨、共同进步!如有转载,请注明出处,谢谢!^_^

jQuery 插件开发——countdown(倒计时)的更多相关文章

  1. jquery.countdown 倒计时插件的学习

    1.第一种简单的使用 第一个时间是你的倒计时截止时间,finalDate格式可以是YYYY/MM/DD MM/DD/YYYY YYYY/MM/DD hh:mm:ss MM/DD/YYYY hh:mm: ...

  2. JavaScript学习笔记(四)——jQuery插件开发与发布

    jQuery插件就是以jQuery库为基础衍生出来的库,jQuery插件的好处是封装功能,提高了代码的复用性,加快了开发速度,现在网络上开源的jQuery插件非常多,随着版本的不停迭代越来越稳定好用, ...

  3. JavaScript学习总结(四)——jQuery插件开发与发布

    jQuery插件就是以jQuery库为基础衍生出来的库,jQuery插件的好处是封装功能,提高了代码的复用性,加快了开发速度,现在网络上开源的jQuery插件非常多,随着版本的不停迭代越来越稳定好用, ...

  4. jQuery插件开发精品教程,让你的jQuery提升一个台阶

    要说jQuery 最成功的地方,我认为是它的可扩展性吸引了众多开发者为其开发插件,从而建立起了一个生态系统.这好比大公司们争相做平台一样,得平台者得天下.苹果,微软,谷歌等巨头,都有各自的平台及生态圈 ...

  5. jquery插件开发

    jQuery是一个封装的很好的类,比如我们用语句$("#btn1") 会生成一个 jQuery类的实例. 一.jQuery插件开发注意要点 1.使用闭包,避免全局依赖,避免第三方破 ...

  6. jQuery插件开发(溢出滚动)

    声明:此程序仅针对手机端,简单的封装一个插件,意在记载插件的开发过程,如有错误及不足之处,还望即时指出. 移动开发的时候,我们经常会遇到滑动事件,众所周知手机端滑动主要依靠touch事件.最近接连遇到 ...

  7. 从零开始学jQuery插件开发

    http://www.w3cfuns.com/notes/19462/ec18ab496b4c992c437977575b12736c.html jQuery 最成功的地方,是它的可扩展性,通过吸引了 ...

  8. jquery插件开发继承了jQuery高级编程思路

    要说jQuery 最成功的地方,我认为是它的可扩展性吸引了众多开发者为其开发插件,从而建立起了一个生态系统.这好比大公司们争相做平台一样,得平台者得天下.苹果,微软,谷歌等巨头,都有各自的平台及生态圈 ...

  9. jQuery插件开发(转)

    jQuery插件开发全解析 jQuery插件的开发包括两种: 一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法.jQuery的全局函数就是属于jQuery命 ...

随机推荐

  1. 【java规则引擎】简单规则的rete网络示意图

    一个Fact通过Session添加到规则网络中,如何进行规则匹配的大致过程如下 (1)通过根结点对象从EntryPointNode的Map集合中找到相应的EntryPointNode对象 (2)Ent ...

  2. 使用dumpbin命令查看dll导出函数及重定向输出到文件【轉】

    查看dll导出函数,一般使用Viewdll等第三方工具. VS开发环境中,可以查看32位和64位的dll.具体使用方法如下: 1. 进入VS开发环境,然后Tools -> Visual stud ...

  3. vim直接编辑远程文件

    本文由Suzzz原创,发布于http://www.cnblogs.com/Suzzz/p/4116341.html,转载请保留此声明. Linux环境下 vim scp://user@hostIP/P ...

  4. CUDA Pro Tip: Optimized Filtering with Warp-Aggregated Atomics

    In this post, I’ll introduce warp-aggregated atomics, a useful technique to improve performance when ...

  5. mysql函数之三:find_in_set() 函数 返回str在字符串集strlist中的序号

    如果字符串str是在的strlist组成的N子串的字符串列表,返回值的范围为1到N. FIND_IN_SET(str,strlist) 如果字符串str是在的strlist组成的N子串的字符串列表,返 ...

  6. MySQL脚本自动安装mysql-5.6.15-linux-glibc2.5-x86_64.tar.gz

    脚本安装mysql-5.6.15-linux-glibc2.5-x86_64.tar.gz 先准备好数据文件的路径 softdir='/data/soft' 把脚本和tar包放在相应的路径下,其实就是 ...

  7. java 基础知识学习

    1:  JDK VS  JRE JDK: java开发工具包,提供编译和运行环境,将java编译成字节码文件,即.class文件.JDK有三个版本: j2SE,  J2EE,  j2me jre: 运 ...

  8. web基础 (四) JavaScript基础

    JavaScript 简史略过…… 一.Javascript结构   ECMAScript  ECMAScript 是一个重要的标准,但它并不是 JavaScript 唯一的部分,当然,也不是唯一被标 ...

  9. DVWA平台v1.9-Command Injection

    命令拼接: &:简单的拼接,第一条命令和第二条命令间没有什么制约关系 &&:第一条命令执行成功了,才会执行第二条命令 |:第一条命令的输出作为第二条命令的输入 ||:第一条命令 ...

  10. [更新中]【South使用总结】django开发中使用South进行数据库迁移

    Django开发中使用South进行数据库迁移的使用总结 South的详细资料可产看官方文档http://south.readthedocs.org/en/latest South安装配置 pip i ...