現在網上關於js和jquery封裝的插件很多,我剛剛接觸前端的時候,就很敬佩那些自己寫插件的大牛們!因為是他們給網站開發更多的便利,很多網頁效果,網上很多現成的插件!那麼這些插件是如何寫的呢?首先是有扎實的js和jquery技術基礎,其次還有一些寫插件的方法和技巧。關於js和jquery的技術基礎,那是一個慢慢積累的過程。但是關於寫插件的一些注意和技巧,本文可以略微介紹一下,方便以後寫插件的時候用得到。
要說jQuery 最成功的地方,我認為是它的可擴展性吸引了眾多開發者為其開發插件,從而建立起了一個生態系統。這好比大公司們爭相做平台一樣,得平台者得天下。蘋果,微軟,谷歌等巨頭,都有各自的平台及生態圈。
學會使用jQuery並不難,因為它簡單易學,並且相信你接觸jQuery後肯定也使用或熟悉了不少其插件。如果要將能力上升一個台階,編寫一個屬於自己的插件是個不錯的選擇。
軟件開發過程中是需要一定的設計模式來指導開發的,有了模式,我們就能更好地組織我們的代碼,並且從這些前人總結出來的模式中學到很多好的實踐。
根據《jQuery高級編程》的描述,jquery插件一般有三種開發方式:
通過$.extend()來擴展jQuery 通過$.fn 向jQuery添加新的方法 通過$.widget()應用jQuery UI的部件工廠方式創建
通常我們使用第二種方法來進行簡單插件開發,說簡單是相對於第三種方式。第三種方式是用來開發更高級jQuery部件的,該模式開發出來的部件帶有很多jQuery內建的特性,比如插件的狀態信息自動保存,各種關於插件的常用方法等,非常貼心,這裡不細說。
而第一種方式又太簡單,僅僅是在jQuery命名空間或者理解成jQuery身上添加了一個靜態方法而以。所以我們調用通過$.extend()添加的函數時直接通過$符號調用($.myfunction())而不需要選中DOM元素($('#example').myfunction())。
$.extend({ sayHello: function(name) { console.log('Hello,' + (name ? name : 'Dude') + '!'); } }) $.sayHello(); //調用 $.sayHello('test'); //帶參調用
但這種方式無法利用jQuery強大的選擇器帶來的便利,要處理DOM元素以及將插件更好地運用於所選擇的元素身上,還是需要使用第二種開發方式。你所見到或使用的插件也大多是通過此種方式開發。
第二種插件開發方式一般是如下定義
$.fn.pluginName = function() { //your code here }
插件開發,我們一般運用面向對象的思維方式
例如定義一個對象
var testObj= function(el, opt) { this.$element = el, this.defaults = { 'color': 'red', 'fontSize': '12px', 'textDecoration':'none' }, this.options = $.extend({}, this.defaults, opt) } //定義testObj的方法 testObj.prototype = { changecss: function() { return this.$element.css({ 'color': this.options.color, 'fontSize': this.options.fontSize, 'textDecoration': this.options.textDecoration }); } }
$.extend({}, this.defaults, opt)有{}主要是為了創建一個新對象,保留對象的默認值。
$.fn.myPlugin = function(options) { //創建haorooms的實體 var testIndividual= new testObj(this, options); //調用其方法 return testIndividual.changecss(); }
調用這個插件直接如下就可以
$(function() { $('a').myPlugin({ 'color': '#2C9929', 'fontSize': '20px' }); })
上面的開發方法存在一個嚴重的問題,就是定義了一個全局的testObj,這樣對於插件的兼容等等各個方面都不好。萬一別的地方用到了testObj,那麼你的代碼就悲催了!現在我們把上面的代碼包裝起來,用一個自調用匿名函數(有時又叫塊級作用域或者私有作用域)包裹,就不會出現這個問題了!包括js插件的開發,也是一樣的,我們用一個自調用匿名函數把自己寫的代碼包裹起來,就可以了!包裹方法如下:
(function(){ })()
用上面的這個包裹起來,就可以了。
但是還有一個問題,當我們研究大牛的代碼的時候,前面經常看到有“;”,那是為了避免代碼合並等不必要的錯誤。
例如,我們隨便定義一個函數:
var testFunction=function(){ } (function(){ })()
由於testFunction()這個函數後面沒有加分號,導致代碼出錯,為了避免這類情況的發生,通常這麼寫!
;(function(){ })()
基本上可以說是完美了。但是為了讓你開發的插件應用更加廣泛,兼容性更加好,還要考慮到用插件的人的一些特殊的做法,例如,有些朋友為了避免jquery和zeptojs沖突,將jquery的前綴“$”,修改為“jQuery”,還有些朋友將默認的document等方法修改。為了讓你的插件在這些東西修了了的情況下照常運行,那麼我們的做法是,把代碼包裹在如下裡面:
;(function($,window,document,undefined){ //我們的代碼。。 })(jQuery,window,document);
就可以避免上面的一些情況了!
至此,你開發的插件就算完美了!
JQ插件標准的封裝---閉包
<script type="text/javascript"> (function ($) { //這裡放入插件代碼 何問起 })(jQuery); </script>
這是jQuery官方的插件開發規范,這樣寫是作用是:
1. 避免全局依賴。
2. 避免第三方破壞。
3. 兼容jQuery操作符’$’和’jQuery’
這段代碼在被解析時會形同如下代碼:
var jq = function($) { // Code goes here }; jq(jQuery);
================更新於2016年2月4日=============
編寫插件
$(function () { $.fn.插件名稱 = function (options) { var defaults = { Event : "click", //觸發響應事件 msg : "Holle word!" //顯示內容 }; var options = $.extend(defaults, options); var $this = $(this); //當然響應事件對象 //功能代碼部分 //綁定事件 $this.live(options.Event, function (e) { alert(options.msg); }); } });
調用插件
$(function () { //綁定元素事件 $("#test").插件名稱({ Event : "click", //觸發響應事件 msg : "插件原來就是這麼簡單!" //顯示內容 }); });
布局
<input type = "button" id = "test" value = "這是一個簡單的插件調用" / >