知識點:
什么是插件
jQuery插件的模式
jQuery插件的Lightweight Start模式(入門級插件模式)
8.1 插件(Plug-in)
“插件”這個關鍵字,估計大家在日常生活中經常有所耳聞。例如:各網頁瀏覽器,允許用戶安裝一些插件,增強用戶體驗,常見的Adobe Flash播放器,銀行安全交易插件等。對於不做編程的朋友來說,是一個無所謂的詞,但是對於咱們IT技術行業的朋友來說,是必須要了解,知道的。
咱們不是學者,不做特別規范的學術性研究,只要能夠理解、夠用就可以了。
因為咱們只是編程行業,所以將插件首先約束在編程領域試着理解。“插件”,是一段程序,它是與主應用程序交互,並擴展、替代主應用程序特定模塊(功能)。
在js及js的一些框架Jqurey、ExtJs、Prototype···也比較流行以開發插件的形式,增強其程序的健壯性、伸縮性、安全性。其中JQuery的流行程度、市場占有率是最高的,當然也是咱們本次學習的 主題。
以下兩個網址是官方資料,感興趣的朋友可以去了解一下。
jQuery官網:http://jquery.com/
jQuery官網插件,有許多比較穩定、實用的插件,如果您感興趣,也可以向官方貢獻你的代碼:http://plugins.jquery.com/
下面一段代碼展示了jQuery插件Django Superformset 的寫法:
/*
* django-superformset
* https://github.com/jgerigmeyer/jquery-django-superformset
*
* Based on jQuery Formset 1.1r14
* by Stanislaus Madueke
*
* Original Portions Copyright (c) 2009 Stanislaus Madueke
* Modifications Copyright (c) 2013 Jonny Gerig Meyer
* Licensed under the BSDv3 license.
*/
(function ($) {
'use strict';
var methods = {
init: function (opts) {
var vars = {}; var opti = $.extend({}, $.fn.superformset.defaults, opts);
var wrapper = vars.wrapper = $(this);
var rows = vars.rows = wrapper.find(options.rowSel); var c = rows.closest(options.containerSel);
//@余下的代碼略···
}(jQuery));
完整代碼示例下載:http://plugins.jquery.com/django-superformset/
另外,謝謝Jonny Gerig Meyer代碼。
如果您還幫助別人解決一些常見的問題,或者想按照自己的想法寫一些有趣並可以重復使用的一些插件,那么請跟緊我的步伐,繼續學習
8.2 模式
學習任何知識首先需要了解一下基礎和一些規則,才能夠在其上面構建自己需要的東西。學習jQuery插件也不例外,在很多社區都有一些最佳實踐,我們先看看一些最基本的jQuery插件知識。
第一種寫法如下,
代碼1:
$.fn.myPluginName = function(){
//@您的插件業務邏輯
}
代碼2:
(function ($) {
$.fn.myPluginName = function(){
//@您的插件業務邏輯
}
})(jQuery);
代碼1與代碼2有什么不同,相信對於大家已經明朗化了。第一,將帶有 $.fn.myPluginName的代碼放入閉包中,可以與外部環境隔離,防止產生沖突,還可以將閉包看做一個模塊,以結構化代碼的作用;第二,將jQuery以參數的形式傳遞進去,映射到$符上,可以防止在其它JavaScript庫之間產生沖突。
第二種寫法如下,
我們可以利用jQuery的jQuery.extend(),能夠一次定義多個函數,這種寫法的主要意義就是在語義表達上更好。
代碼3:
(function ($) {
$.extend($.fn, {
myPlugin : function () {
//@您的插件業務邏輯
}
});
})(jQuery)
8.3 Lightweight Start模式
通過上邊的介紹,大家已經具備jQuery插件的基礎知識了。下面通過一段簡單的代碼向大家展示一下Lightweight Start模式,具體解釋請看代碼注釋。
代碼4:
/*
* jQuery Lightweight 插件
* 新浪微博 :@席新亮_javascript_html5
* QQ:939898101
* Email:939898101@qq.com
*/
/*
*1,在代碼開始之前,加一個分號,可以防止沒有正常關閉的插件
*2,undefined是ECMAScript3中定義的,可以修改,但在ECMAScript5中undefined不能修改。
* undefined沒有真正傳遞進來以保證是真正的undefined
*3,把window與document傳遞進來作為局部變量,可以減少作用域的訪問,加快速度,以及降低引用同一個插件的影響
*/
; (function ($, window, document, undefined) {
//私有 默認變量
var myPluginName = "defaultName",
defaults = {
otherName : "value"
};
//私有 構造插件的函數
var ctorPlugin = function (element, options) {
this.element = element;
//利用jQuery 的extend 方法合並對象 this.opti defaults, options);
this._default = defaults;
this.name = myPluginName ;
this.init();
};
//原型鏈上添加方法
ctorPlugin .prototype.init = function () {
//執行一些初始化的邏輯,然后就可以訪問DOM,進行一些業務處理
};
//將插件包裝起來,利用模塊模式,防止多次實例出現
$.fn[myPluginName ] = function (options) {
return this.each(function () {
var myPluginNameStr = "plugin_" myPluginName ;
if (!$.data(this, myPluginNameStr )) {
$.data(this, myPluginNameStr , new ctorPlugin (this, options));
}
});
};
})(jQuery, window, document);
用法如下: elementStr為獲取節點的指定字符
$(elementStr). defaultName({
otherName : "your value"
});
通過以上代碼可以看出:
必須有分號
將window、document、undefined作為參數傳入
一些基本的(私有)默認對象
簡單的插件構造函數,執行一些初始化
擴展默認值的一些選項
一個包裝器避免多次創建
8.4 擴展視野
jQuery 插件官方學習:http://learn.jquery.com/plugins/