jQuery 插件開發——countdown(倒計時)


  故事背景:按照慣例,先寫下故事背景,其實也是再次匯報下最近開發情況的。做電商的都知道,這是個活動季啊,雙十一、雙十二、元旦。。。。各種啊。。其實說這么多就是想表達最近比較忙。呵呵^_^,正好今天抽點空來我最愛的網站寫點自己喜歡的和大家分享下。

  還是之前按之前所說,插件源於開發需求。正好最近項目中需要用到計時器和預加載圖片功能,本人心血來潮,決定整個插件封裝一下,即滿足了項目的需要,也滿足自己的愛好啊,算是一舉兩得吧^^。其實寫插件的時候要考慮到很多,因為公共的東西,如果出錯,那后果會影響很大。畢竟不是一個地方用。所以,開發插件的時候一定要考慮全面。經過N次自測和他測,然后再使用。也就是我之前所說的,好的插件源於測試。經不起測試的插件,那就是個大坑啊。相信不少程序猿同仁被坑過啊。說多了都是淚啊。。。。所以現在的我是能不用第三方的堅決不用,就算麻煩也要自己去寫。。。

  額。。好像又扯多了,這里就是程序猿網上的家啊,到了家里就是能說,一不小心就說多了。。。好了,開始本次插件系列開發的正題吧。

  故事經過:本次開發的插件是countdown(倒計時),這個是個小插件,可能都是大家看不起眼的插件。呵呵,也許吧。功能的確簡單。但是可擴展性可是很強的啊,例如,如果一個頁面上有多個這樣的倒計時,(例如淘寶頁面的商品倒計時)難不成要寫多次?當然不是這樣。大部分的倒計時都是用window.setInterval實現的。使用window.setInterval就會涉及到關閉計時器的動作。這個動作也是很多人常常會漏掉的,希望大家養成良好習慣,及時關閉計時器。否則會給頁面帶來很大開銷。更何況如果一個頁面有很多個這樣的計時器,例如淘寶的限時促銷活動。一個頁面可能有幾十個倒計時器,如果在結束時候不關閉,那么這樣的影響就很大了。所以,猿們,我們得養成好習慣啊。得像獅學習啊。^_^

  其實當一個頁面有未知個數的倒計時的時候,那么我們就要專門去控制關閉了,而不是那么簡單的clearInterval("...");了。所以,一個看似簡單的倒計時,只要你肯挖掘里面的需求,其實也不是那么簡單。當然嘍,也不是很復雜了。

  先說下本倒計時的功能吧。1、支持同一個頁面多個倒計時;2、倒計時結束后,能自動釋放計時器;

  看過我之前寫的插件開發系列的都知道我寫插件的規范,或者說是習慣吧。老樣子,開發插件分三步走:

  第一步:定義插件和參數  var countdown= function () {this.defaultParams = {};};

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

  第三步:對外分裝  $.countdown= new countdown();

  這里在啰嗦兩句,為啥老是這樣寫呢,首先,做任何事情都要按“步驟”來,這里不是說要按部就班啥的,是一種自己看好的習慣,也算是我個人理解的一個規范吧。第二,這樣寫思路很清晰,目的也很明確,剩下的只需要你去填充就行了。當然了,每個插件的內部實現都是不一樣的,難易不一,這個只能算個框架,或是說思路吧。

  這篇博文寫了很久,主要是忙了一段時間忘記了,今天又拿出來,補上吧。算是給自己一點安慰吧,一般我不喜歡拖着一件事情的,尤其是自己喜歡的事情。^_^

  好了,該是貼代碼的時刻了,哈哈  

 1 /*
 2  *  instructions :countdown  
 3  *  date : 2014-10-26
 4  *  author : 張文書
 5  *  Last Modified 2014-10-17
 6  *  By 張文書
 7  */ 
10 $(function () { 
12     ///說明:
13     ///     倒計時
14     var countdown = function () {
15         this.defaults = {
16             endDateTime: "",//結束時間  格式"yyyy-MM-dd HH:mm:ss"
17             currentDateTime: "",//服務器當前時間 格式"yyyy-MM-dd HH:mm:ss"
18 
19             remainDaysId: "",//剩余天 ID
20             remainHoursId: "",//剩余小時 ID
21             remainMinutesId: "",//剩余分鍾 ID
22             remainSecondsId: "", //剩余秒鍾 ID
23             countDownName: "",  //倒計時器名稱
24             difference: 0    //時間間隔(無需賦值,只做接收)
25         };
26         this.options = {}; 
28     }; 
30     countdown.prototype = { 
32         constructor: countdown, 
34         init: function (params) {
35             this.options = $.coverObject(this.defaults, params);
36             this._initCountdown(); 
38         }, 
40         _initCountdown: function () { 
42             this.options.difference = this.getDifference();
43             var options = this.options;
44             this.options.countDownName = window.setInterval(function () {
45                 countdown.prototype.getCountdownTime(options);
46             }, 1000); 
48         }, 
50         //說明:
51         //      返回結束時間和當前服務器時間的差值
52         getDifference: function () { 
54             var endDateTime = this.convertStrToDate(this.options.endDateTime);//設置結束時間
55             var endTime = endDateTime.getTime();//定義參數可返回距 1970 年 1 月 1 日之間的毫秒數   
57             var nowTime = this.convertStrToDate(this.options.currentDateTime);//當前時間
59             var difference = endTime - nowTime.getTime();//差值
60             return difference;
61         },
63         //說明:
64         //      獲得並顯示倒計時時間
65         getCountdownTime: function (options) { 
67             options.difference = options.difference - 1000; 
69             var nMS = options.difference;
70             var nD = Math.floor(nMS / (1000 * 60 * 60 * 24));//獲得天數
71             var nH = Math.floor(nMS / (1000 * 60 * 60)) % 24;//獲得小時
72             var nM = Math.floor(nMS / (1000 * 60)) % 60;//獲得分鍾
73             var nS = Math.floor(nMS / 1000) % 60;//獲得秒鍾
74             if (nMS < 0) {
75                 clearInterval(options.countDownName);//停止
76             } else {
77                 $("#" + options.remainDaysId).text(nD < 10 ? "0" + nD : nD);//顯示天數  
78                 $("#" + options.remainHoursId).text(nH < 10 ? "0" + nH : nH);//顯示小時  
79                 $("#" + options.remainMinutesId).text(nM < 10 ? "0" + nM : nM);//顯示分鍾  
80                 $("#" + options.remainSecondsId).text(nS < 10 ? "0" + nS : nS);//顯示秒鍾  
81             }
82         },
84         //說明:
85         //      將字符串轉成時間類型
86         convertStrToDate: function (strDate) {
87             var date = eval('new Date(' + strDate.replace(/\d+(?=-[^-]+$)/, function (a) { return parseInt(a, 10) - 1; }).match(/\d+/g) + ')');
88             return date;
89         }
90     };
92     $.countdown = new countdown();
94 });

  代碼很簡單,而且都有我開發的時候寫的注釋(我個人有寫注釋的習慣,當然這些注釋不光是寫個我自己看的。我認為,寫好注釋也是一種團隊意識的表現。記住:你寫的代碼最終不僅僅是為了給自己看。為啥我就不解釋了,都懂^_^),代碼我就不一一解釋了,注意傳遞的參數,要傳很多標簽id。當然如果你有興趣,可以將其封裝在插件里,通過jquery輸出到頁面,這個也很簡單。這里只是提供個意見。

  因為本來就是一個簡單的功能,所以也就沒有樣式表了。如果有不清楚的園友,請隨時聯系我。當然,如果您有更好的意見,還請不吝賜教啊,如果有想共同探討插件開發(或者其他)的同仁,隨時聯系我,QQ:296319075 ,注明園友就好,同時也希望大家也能提出寶貴意見。秉承共同探討、共同進步!如有轉載,請注明出處,謝謝!^_^

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM