閱讀387 返回首頁    go 阿裏雲 go 技術社區[雲棲]


jQuery插件的幾種寫法大總結

插件編寫的目的是給已經有的一係列方法或函數做一個封裝,以便在其他地方重複使用,方便後期維護

jQuery插件開發方式

通過$.extend()來擴展jQuery

通過$.fn 向jQuery添加新的方法

通過$.widget()應用jQuery UI的部件工廠方式創建

三種jQuery插件開發方式說明

$.extend()相對簡單,一般很少能夠獨立開發複雜插件,僅僅是在jQuery命名空間或者理解成jQuery身上添加了一個靜態方法而以

我們調用通過$.extend()添加的函數時直接通過$符號調用($.myfunction()),而不需要選中DOM元素($('#example').myfunction())

$.widget()是一種高級的開發模式,該模式開發出來的部件帶有很多jQuery內建的特性,比如插件的狀態信息自動保存,各種關於插件的常用方法等

$.fn則是一般插件開發用到的方式,可以利用jQuery強大的選擇器帶來的便利,以及將插件更好地運用於所選擇的元素身上,使用的插件也大多是通過此種方式開發

$.extend()擴展jQuery的實例

$.extend({
    sayHello: function(name) {
        console.log('Hello,' + (name ? name : 'aaa') + '!');
    }
})
$.sayHello(); //Hello,aaa
$.sayHello('bbb'); //Hello,bbb

說明:上麵代碼中,通過$.extend()向jQuery添加了一個sayHello函數,然後通過$直接調用

$.fn方式插件開發

定義

$.fn.pluginName = function() {
    //your code here
}

定義說明

基本上就是往$.fn上麵添加一個方法,名字是我們的插件名稱。然後我們的插件代碼在這個方法裏麵展開

簡單實例

將頁麵上所有鏈接顏色轉成紅色,則可以這樣寫這個插件

$.fn.myPlugin = function() {
    //在這裏麵,this指的是用jQuery選中的元素 example :$('a'),則this=$('a')
    this.css('color', 'red');
}

實例說明

1、在插件名字定義的這個函數內部,this指代的是我們在調用該插件時,用jQuery選擇器選中的元素,一般是一個jQuery類型的集合。在插件名字定義的這個函數內部,this指代的是我們在調用該插件時,用jQuery選擇器選中的元素,一般是一個jQuery類型的集合

2、如果通過調用jQuery的.each()方法處理集合中的每個元素時要注意的是,在each方法內部,this指帶的是普通的DOM元素了,如果需要調用jQuery的方法那就需要用$來重新包裝一下

$.fn.myPlugin = function() {    
    this.css('color', 'red');   //在這裏麵,this指的是用jQuery選中的元素
    this.each(function() {        
        $(this).append(' ' + $(this).attr('href'));   //對每個元素進行操作
    }))
}

實例插件的使用

<ul>
    <li> <a href="#">aaa</a> </li>
    <li> <a href="#">bbb</a> </li>
    <li> <a href="#">ccc</a> </li>
</ul>
<p>這是p標簽不是a標簽,我不會受影響</p>
<script type="text/javascript">
    $(function(){
        $('a').myPlugin();
    })
</script>

讓插件支持鏈式調用

jQuery一個時常優雅的特性是支持鏈式調用,選擇好DOM元素後可以不斷地調用其他方法。要讓插件不打破這種鏈式調用,隻需return一下即可

$.fn.myPlugin = function() {    
    this.css('color', 'red');   //在這裏麵,this指的是用jQuery選中的元素
    return this.each(function() {        
        $(this).append(' ' + $(this).attr('href'));   //對每個元素進行操作
    }))
}

讓插件接收參數

1、一個強勁的插件是可以讓使用者隨意定製的,這要求我們提供在編寫插件時就要考慮得全麵些,盡量提供合適的參數

2、比如現在我們不想讓鏈接隻變成紅色,我們讓插件的使用者自己定義顯示什麼顏色,要做到這一點很方便,隻需要使用者在調用的時候傳入一個參數即可。同時我們在插件的代碼裏麵接收

3、為了靈活,使用者可以不傳遞參數,插件裏麵會給出參數的默認值

4、在處理插件參數的接收上,通常使用jQuery的extend方法,當給extend方法傳遞一個以上的參數時,它會將所有參數對象合並到第一個裏。同時,如果對象中有同名屬性時,合並的時候後麵的會覆蓋前麵的。

5、可以在插件裏定義一個保存插件參數默認值的對象,同時將接收來的參數對象合並到默認對象上,最後就實現了用戶指定了值的參數使用指定的值,未指定的參數使用插件默認值

6、保護好默認參數:做法是將一個新的空對象做為$.extend的第一個參數,defaults和用戶傳遞的參數對象緊隨其後,這樣做的好處是所有值被合並到這個空對象上,保護了插件裏麵的默認值

7.實例

$.fn.myPlugin = function(options) {
    var defaults = {
        'color': 'red',
        'fontSize': '12px'
    };
    var settings = $.extend({}, defaults, options);
    return this.css({
        'color': settings.color,
        'fontSize': settings.fontSize
    });
}

插件開發中的命名空間

2、不僅僅是jQuery插件的開發,我們在寫任何js代碼時都應該注意的一點是不要汙染全局命名空間。因為隨著你代碼的增多,如果有意無意在全局範圍內定義一些變量的話,最後很難維護,也容易跟別人寫的代碼有衝突

2、比如你在代碼中向全局window對象添加了一個變量status用於存放狀態,同時頁麵中引用了另一個別人寫的庫,也向全局添加了這樣一個同名變量,最後的結果肯定不是你想要的。所以不到萬不得已,一般我們不會將變量定義成全局的

3、可以使用自調用匿名函數包裹插件代碼

(function() {
 $.fn.myPlugin = function(options) {
    var defaults = {
        'color': 'red',
        'fontSize': '12px'
    };
    var settings = $.extend({},defaults, options);//將一個空對象做為第一個參數
    return this.css({
        'color': settings.color,
        'fontSize': settings.fontSize
    });
 }
})();

盡量在插件的最前麵加上分號

這樣可以避免我們將這段代碼放到頁麵後,前麵別人寫的代碼沒有用分號結尾,這樣,這個插件代碼就會報錯。

可以將係統變量以變量形式傳遞到插件內部

;(function($,window,document,undefined){
    //我們的代碼。。
    //...
})(jQuery,window,document);

將插件代碼混淆與壓縮的方法

1、我們下載的插件裏麵,一般都會提供一個壓縮的版本一般在文件名裏帶個'min'字樣。也就是minified的意思,壓縮濃縮後的版本。例如,並且平時我們使用的jQuery也是官網提供的壓縮版本,jquery.min.js

2、這裏的壓縮不是指代碼進行功能上的壓縮,而是通過將代碼裏麵的變量名,方法函數名等等用更短的名稱來替換,並且刪除注釋(如果有的話)刪除代碼間的空白及換行所得到的濃縮版本。同時由於代碼裏麵的各種名稱都已經被替代,別人無法閱讀和分清其邏輯,也起到了混淆代碼的作用

javascript變量規範

在javascript中,沒有真正意義的共有變量、私有變量、常量等概念,當javascript代碼達到一定數量級時,過段時間回頭看自己寫的代碼,會把自己也搞暈的

1、請在私有變量前加“_” 比如: var _pub = this.pub;

2、常量請大寫 比如: this.COLOR = "red";

3、jquery對象變量前加“$” 比如: this.$Obj = $("#layout");

4、object、array變量前加“o”、“a”很多人喜歡給數組變量加個”s”,這也是可以的,按個人習慣,如果你覺得有必要還可以給函數前加個“fn”。

jquery插件開發的一些建議

1、請多使用data()方法jquery中data()方法非常有用,尤其在jquery插件開發中,因為data()所創建的緩存,可以完整的保存各種數據類型的數據,這是其他緩存機製無法比擬的。
2、請使用bind來綁定事件 很多朋友喜歡以下的代碼:
$(".yitip").click(function(){ ........ })

但在jquery插件開發中更提倡使用bind:
$(".yitip").bind('click',function(){ ......... })

3、善用typeof typeof用於判斷數據類型,這個方法在參數判斷中非常有用處
4、插件名加個獨有前綴 jquery插件有太多太z了,插件撞車時很容易的事,比如搜索框插件:
$.fn.tips = function(options){ }

最後更新:2017-06-15 17:32:16

  上一篇:go  天貓國際2018年續簽規則升級
  下一篇:go  【大數據開發套件調度配置實踐】——調度任務各種周期配置和調度形態