一,開頭分析
Hi,大家!今天這系列文章主要是說如何開發基於「JavaScript」的插件式開發,我想很多人對」插件「這個詞並不陌生,
有的人可能叫“組件”或“部件”,這不重要,關鍵是看如何設計,如何做一個全方位的考量,這是本文的重點闡述的概念。我想大家對
「jQuery插件的方式」有一定的了解,我們結合這個話題一起討論一下,最後給出相關的實作方案,來不斷提升自己的誰能力。
二,進入外掛正題
一般來說,jQuery外掛的開發分為兩種:一種是掛在jQuery命名空間下的全域函數,也可稱為靜態方法。
另一種是jQuery物件層級的方法,即掛在jQuery原型下的方法,這樣透過選擇器取得的jQuery物件實例也能共享此方法。
(1),類別層級的插件開發
類別層級的外掛程式開發最直接的理解就是為"jQuery"類別加入類別方法,可以理解為新增靜態方法。典型的例子就是"$.ajax()"這個函數,將函數定義於jQuery的命名空間。關於類別層級的外掛程式開發可以採用以下幾種形式進行擴充:
1.1新增一個全域函數,我們只需如下定義,看程式碼:
1.2新增多個全域函數,可採用以下定義:
說明:」$.extend(target, [object1], [objectN])「(此方法主要用於合併兩個或更多對象的內容(屬性)到第一個對象,並傳回合併後的第一對象。
如果方法只有一個參數target,則該參數將擴展jQuery的命名空間,即作為靜態方法掛在jQuery全域物件下)。(2),物件層級的插件開發
物件層級的外掛程式開發需要如下的兩種形式:
2.1透過「$.fn.extend()」為原型動態掛載相關的屬性。
說明一下:二者是等價的,對於一個jQuery插件,一個基本的函數就可以很好地工作,但是對於複雜一點的插件就需要提供各種各樣的方法和私有函數。
你可能會使用不同的命名空間去為你的插件提供各種方法,但是添加過多的命名空間反而會使程式碼變得混亂,健壯性下降。所以最好的解決方法是適當地定義私有函數和方法。
所以我們透過自執行函數與閉包的結合實現模擬的私有插件單元,就像我們上面的實例一樣。
(三),下面給一個簡單的例子來看看實現的過程:
(1),「html」片段程式碼,如下:
(2),「data.json」定義如下:
(3),"bb.js"程式碼如下:
運作效果:
小結一下:
(1)“$.fn.bigbear.defaults”提供插件的預設參數選項一個擴展性良好的插件應該是可以讓用戶根據需求自訂參數選項,並控制插件的行為,所以提供恢復默認選項是很有必要的。你可以透過jQuery的extend方法來設定這些選項。
(2),「return this.each(){...}」遍歷多個元素並返回jQuery使用Sizzle選擇器引擎,Sizzle可以為你的函數提供多元素操作(例如對所有類別名稱相同的元素)。這是jQuery幾個優秀的特性之一,在開發插件過程中即使你不准備為你的插件提供多元素支持,但為這做準備仍然是一個很好的方式。另外,jQuery有一個很好的特點就是可以進行方法級聯,也可稱為鍊式調用,所以我們不應該破壞這個特性,總是會在方法中傳回一個元素。
(四),最後總結
(1),jQuery為開發插件提拱了兩個方法,分別是:jQuery.fn.extend(object); 新增方法給jQuery物件。
jQuery.extend(object); 為擴展jQuery類別本身.為類別新增新的方法。
(2),把全部程式碼放在閉包(一個即時執行函數)裡此時閉包相當於一個私有作用域,外部無法存取到內部的信息,並且不會存在全域變數的污染情況。官方創建開發規範的解釋是:a) 避免全域依賴;b) 避免第三方破壞;c) 相容jQuery操作符'$'和'jQuery '。
(3),提供插件的預設參數選項一個擴展性良好的插件應該是可以讓使用者根據需求自訂參數選項,並控制插件的行為,所以提供恢復預設選項是很有必要的。你可以透過jQuery的extend方法來設定這些選項
(4),遍歷多個元素並返回jQuery使用Sizzle選擇器引擎,Sizzle可以為你的函數提供多元素操作(例如對所有類別名稱相同的元素)。這是jQuery幾個優秀的特性之一,在開發插件過程中即使你不准備為你的插件提供多元素支持,但為這做準備仍然是一個很好的實踐。另外,jQuery有一個很好的特點就是可以進行方法級聯,也可稱為鍊式調用,所以我們不應該破壞這個特性,總是會在方法中傳回一個元素。
(5),一次性程式碼放在主循環以外這一條很重要,但是常常被忽略。簡單的講,如果你有一段程式碼是一堆預設值,只需要被實例化一次,而不是每次呼叫你插件功能的時候都需要實例化,你應該把這段程式碼放在插件方法的外面。
(6),大家學習完思考一下,如果專案技術選型換了這些插件又是強依賴「jQuery」機制,我們以前寫的插件將會不能用(假設不用jQuery的情況),如何做重構那?
明天的文章就會說一下這個問題,並且將會重構插件的關鍵邏輯,敬請期待。 。 。