2015年10月24日 星期六

自製jQuery的PlugIn(twinkle演示範例)

JQuery提供外掛(Plug-In)能力,可以讓使用者設計自己所需的功能,跟自己做一個客製化類別(Class)不一樣,外掛就相當於是jQuery物件能夠使用的功能,能夠用selector的方式直接得到jQuery物件然然後使用,就像顯示物件是 $("selector").show();一樣,我們也可以自己寫一個外掛來用,例如$("selector").myPlugInFun();

以下為在寫JQuery的Plug-In時,常使用的其中一種寫法(只是舉例,寫法因人而異):

(function($){

    //這裡可設制function或變數

    $.fn.extend({

           //這裡可設制function或變數

           myPlugInFun1 : function(options){

                                         //這裡可設制function或變數,跟Java或C很不一樣的是,

                                         //JavaScript的function也算一種Object,所以可以在function裡設

                                         //function屬性

                                         var defaultOptions1 = {

                                               option1 : "option1" ,

                                               option2 : "option2"

                                         };

                                          return this.each(function(){

                                              $.extend(defaultOptions,options);

                                              //..........Do something

                                          });

                                      } ,

           myPlugInFun2 : function(options){

                                            ...以此類推

                                      }

    });

})(jQuery);


下面我們來寫一個簡單的jQuery Plug-In,叫做twinkle(),其作用是讓選取的jQuery物件可以依自訂(當然也可以預設)的次數及間隔時間閃爍,且也可以設定執行完後的callback function及擁有串接的特性,相關的說明註解都在程式碼中,直接看程式碼:


Twinkle jQuery Plun-In :

//自製jQuery Plug-In

//使用括弧來圍住function($){}來避免與外界變數衝突,

//例如不圍往的話外界可能會不小心用到了Plug-In裡的變數

//使用(function($){})(jQuery)來表示function中的$都用jQuery代表, 避免外界用了

//jQuery.noConflict()來設定了不同的jQuery符號來取代$符號

(function ($) {

    $.fn.extend({

        //閃爍範例

        twinkle: function (options) {

            //預設參數

            var defaultOptions = {

                times: 5,    //閃爍次數(先亮再暗算一次)

                period: 500, //閃爍間隔(亮與暗的間隔)

                callback: function (target) {}  //執行完閃爍後要執行的callback

            };

            $.extend(defaultOptions, options);  //覆蓋自訂的參數到預設參數中

            //使用return傳回jQuery物件,使其Plug-In使用時擁有串接特性

            return this.each(function () {      //這裡的this是jQuery物件,each()裡的是

                                                //JavaScript的DOM物件

                var target = $(this);           //取得各別DOM物件的jQuery物件

                var originalVisibilityStatus = $(this).css('visibility'); //取得原來的visibility css屬性

                var currentTimes = 0;           //現在的回數

                startTwinkle();



                function startTwinkle() {

                    if (currentTimes < defaultOptions.times) {

                        lighten();

                        //間隔一段時間後變暗,回數加一

                        setTimeout(function () {

                            darken();

                            currentTimes++;

                            //間隔一段時間後遞迴呼叫自己startTwinkle

                            setTimeout(function () {

                                startTwinkle();

                            }, defaultOptions.period);

                        }, defaultOptions.period);

                    } else {

                        //將target的visibility css屬性設回原來的值,執行callback function

                        target.css('visibility', originalVisibilityStatus);

                        defaultOptions.callback(target);

                    }

                }



                function lighten() {

                    target.css('visibility', 'visible');

                }



                function darken() {

                    target.css('visibility', 'hidden');

                }

            });

        }

    });

})(jQuery);


使用方法範例:

$('p').twinkle({

    times: 10,

    period: 100,

    callback: function (target) {

        target.html('Twinkle Done!');

    }

}).css('color','blue');


影片演示:


線上程式實作演示:
http://jsfiddle.net/w4u7vn8n/1/

參考資料:

  1. 邊做邊學jQuery系列13 - 自己打造jQuery Plugin
  2. [程式][JQuery] 自己的第一個JQuery Plugin! Hello World。(Part_01)

沒有留言 :

張貼留言