Jquery 插件入門

網上一搜各種插件,什麼文件上傳,圖片瀏覽 ,Autocomplete等

 

這些插件,源代碼,新手看起來是很吃力的,當然我也是新手,我開始改AutoComplete這個插件一點點,卻真不知道如何開始,後面就用Firefox的fireDebug慢慢看。

 

我也不是專門做前端的,但是總得瞭解,基本的使用還是得會。

 

 

 

今天,來總結下,最近看的插件的基礎知識,這裡算個入門,希望能幫到新手黨們。

 

下面是2個非常重要的擴展函數。

 

.extend and.fn.extend

 

$.extend(object) 可以理解為JQuery 添加一個靜態方法。

 

$.fn.extend(object) 可以理解為JQuery實例添加一個方法。

 

基本的定義與調用:

 

復制代碼

/* $.extend 定義與調用

 */

$.extend({ fun1: function () { alert("執行方法一"); } });

$.fun1();

/*  $.fn.extend 定義與調用

 */

$.fn.extend({ fun2: function () { alert("執行方法2"); } });

$(this).fun2();

//等同於

$.fn.fun3 = function () { alert("執行方法三"); }

$(this).fun3();

復制代碼

  $.extend(target, [object1], [objectN]) 還有個用法,就是合並到第一個object.

 

該方法主要用於合並兩個或更多對象的內容(屬性)到第一個對象,並返回合並後的第一對象。如果該方法隻有一個參數target,則該參數將擴展jQuery的命名空間,即作為靜態方法掛在jQuery全局對象下,如jQuery裡的$.ajax、$.getJSON全局函數等,如前面看到的:

 

值得註意的是:多個對象參數合並時,會破壞第一個對象的結構,所以可傳遞一個空對象作為第一個參數,如:$.extend({}, object1, object2);

 

 var options = $.extend({},defaults, options);

 

 

上面代碼就是合並到{}中,然後賦值到options。這個在寫插件的時候經常使用,用戶可以自己定義某些屬性,

 

插件一般也會定義默認屬性,調用上面方法後,如果自定義屬性,這使用新屬性,否則,則使用默認屬性,這個是非常有用的。

 

 

 

$.fn.extend(target)

 

在jQuery中,.fn本質上是等於jQuery的原型,即.fn = $.prototype, 所以該方法實際上是為jQuery原型添加方法,即把target對象的方法添加到jQuery原型中去,這樣jQuery對象實例就可以訪問添加的方法瞭,這也是jQuery插件開發常用的方法,特別是添加多個接口時。如:

 

// 將hello、hello2方法添加到jquery原型中

$.fn.extend({ 

    hello: function() {alert("hello!");},

    hello2: function() {alert("hello again!);}

});

看看Autocomplete插件使用的該方法。

 

 

$.fn.extend({

    autocomplete: function(urlOrData, options) {

        var isUrl = typeof urlOrData == "string";

        options = $.extend({}, $.Autocompleter.defaults, {

            url: isUrl ? urlOrData : null,

            data: isUrl ? null : urlOrData,

            delay: isUrl ? $.Autocompleter.defaults.delay : 10

            max: options && !options.scroll ? 1000 : 15000

        }, options);

        

        // if highlight is set to false, replace it with a do-nothing function

        options.highlight = options.highlight || function(value) { return value; };

        

        // if the formatMatch option is not specified, then use formatItem for backwards compatibility

        options.formatMatch = options.formatMatch || options.formatItem;

        

        return this.each(function() {

            new $.Autocompleter(this, options);

        });

    },

    result: function(handler) {

        return this.bind("result", handler);

    },

    search: function(handler) {

        return this.trigger("search", [handler]);

    },

    flushCache: function() {

        return this.trigger("flushCache");

    },

    setOptions: function(options){

        return this.trigger("setOptions", [options]);

    },

    unautocomplete: function() {

        return this.trigger("unautocomplete");

    }

});

 

看不懂?沒關系,下面馬來接上。

 

 

 

如果添加單個方法到jQuery原型中,可使用$.fn.pluginName方法添加,如:

 

// 將hello方法添加到jquery原型中

$.fn.hello = function() {

    // …            

};

  

 

 

 

插件通用模板(單個方法):

 

插件有自己的基本格式:

 

 

;(function($){

    $.fn.yourName = function(options){

        //各種屬性、參數

        }

        var options = $.extend(defaults, options);

        return this.each(function(){

        //插件實現代碼

        });

    };

})(jQuery);

 

 上面代碼的最前面有一個分號,這是為瞭防止多個腳本文件合並時,其他腳本的結尾語句沒有添加分號,造成運行時錯誤。

 

 

 

1、把全部代碼放在閉包(一個即時執行函數)裡

 

此時閉包相當於一個私有作用域,外部無法訪問到內部的信息,並且不會存在全局變量的污染情況。官方創建開發規范的解釋是:

 

a) 避免全局依賴;

 

b) 避免第三方破壞;

 

c) 兼容jQuery操作符'$'和'jQuery '。

 

如下所示:

 

(function($) {

    // 局部作用域中使用$來引用jQuery

    // …

})(jQuery);

 

 

這段代碼在被解析時可理解成以下代碼:

 

var jQ = function($) {

  // code goes here

}; 

jQ(jQuery);

 

 

新手如果無法理解,你知道,這是官方標準就ok。

 

 

 

下面是這個美化表格的例子,實現原理倒是簡單,無非就是找到表格的奇偶行,然後添加不同的class,活動行高亮顯示也很簡單,隻要判斷mouseover事件,然後添加一個class,mouseout的時候,再去掉這個class即可。

 

 

 

查看這個鏈接能看到詳細,你可以查看具體看看,寫的不錯,特別是步驟很清晰。

 

 

 

好,基本框架曉得瞭,下面就是填充具體內容瞭。

 

復制代碼

(function($){

    $.fn.tableUI = function(options){

        var defaults = {

            evenRowClass:"evenRow",

            oddRowClass:"oddRow",

            activeRowClass:"activeRow"            

        }

        var options = $.extend({},defaults, options);

        this.each(function(){

            //實現代碼

        });

    };

})(jQuery);

 

 

 

重復一句:

 

var options = $.extend({},defaults, options);

其實就是合並多個對象為一個。這裡就是,如果你在調用的時候寫瞭新的參數,就用你新的參數,如果沒有寫,就用默認的參數。想進一步瞭解的朋友,可以參考jquery的官方文檔: http://api.jquery.com/jQuery.extend/

 

 

 

其實,這裡定義默認 var defaults是不規則的寫法,

 

規則該是這樣

 

 

$.fn.TableUI.defaults={    

  evenRowCass: "evenRow", 

  oddRowClass: "oddRow",

  activeRowClass: "activeRow"

};

 

options = $.extend({},$.fn.TableUI.defaults,options);

  

 

好瞭,直接看全部代碼:

 

 

//這裡最好寫上相關描述,如時間,作者,主要用於幹什麼

/*

 * tableUI 0.1

 * Copyright (c) 2009 JustinYoung  http://justinyoung.cnblogs.com/

 * Date: 2010-03-30

 * 使用tableUI可以方便地將表格提示使用體驗。先提供的功能有奇偶行顏色交替,鼠標移上高亮顯示

 */

 

;(function($){

    $.fn.tableUI = function(options){

  $.fn.TableUI.defaults={ 

    evenRowCass: "evenRow", 

    oddRowClass: "oddRow",

    activeRowClass: "activeRow"

  };

 

       var options = $.extend({}, $.fn.TableUI.defaults, options); //合並

        return this.each(function(){

            var thisTable=$(this);

            //添加奇偶行顏色

            $(thisTable).find("tr:even").addClass(options.evenRowClass);

            $(thisTable).find("tr:odd").addClass(options.oddRowClass);

            //添加活動行顏色

            $(thisTable).find("tr").bind("mouseover",function(){

                $(this).addClass(options.activeRowClass);

            });

            $(thisTable).find("tr").bind("mouseout",function(){

                $(this).removeClass(options.activeRowClass);

            });

        });

    };

})(jQuery);

 

 

下面是調用代碼。

 

 

 <script src="Scripts/jquery-1.4.1.min.js" type="text/javascript"></script>

    <script src="Scripts/TableUI.js" type="text/javascript"></script>

    <script type="text/javascript">

        $(document).ready(function () {

            $(".table_solid").TableUI({ evenRowCass: "eventRow", oddRowClass: "oddRowClass", activeRowClass: "activeRow" }); //這裡是輸入新的參數,不使用默認參數。插件代碼會自動覆蓋。

        })

    </script>

    <style type="text/css">

        body

        {

            font-family: 'Verdana' , '宋體';

            font-size: 12px;

        }

        .eventRow

        {

            background-color: #f0f0ff;

        }

        .activeRow

        {

            background-color: #FFFF55;

        }

        .oddRowClass

        {

            background-color: red;

        }

    </style>

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *