以下為在寫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/
參考資料:
沒有留言 :
張貼留言