當前位置:成語大全網 - 書法字典 - jQuery如何編寫插件?插件的格式是什麽?

jQuery如何編寫插件?插件的格式是什麽?

jQuery插件的開發包括兩種類型:

壹種是類級插件開發,即向jQuery添加新的全局函數相當於向jQuery類本身添加方法。jQuery的全局函數是屬於jQuery名稱空間的函數,另壹個是對象級插件開發,即向jQuery對象添加方法。下面詳細介紹這兩個功能的開發。

1,類級插件開發

在類級別對插件開發最直接的理解是在jQuery類中添加類方法,可以理解為添加靜態方法。壹個典型的例子是函數$。AJAX(),它在jQuery的名稱空間中定義。類級別的插件開發可以通過以下形式進行擴展:

1.1添加壹個新的全局函數。

要添加全局函數,我們只需將其定義如下:

Java代碼

jquery . foo = function(){

alert(‘這是壹個測試。這只是壹次測試。);

};

1.2添加多個全局函數

添加多個全局函數,其定義如下:

Java代碼

jquery . foo = function(){

alert(‘這是壹個測試。這只是壹次測試。);

};

jquery . bar = function(param ){

alert(“此函數接受壹個參數,該參數為““+ param +““。“);

};

它的調用與函數相同:jquery . foo();jquery . bar();或美元。foo();$.酒吧(“酒吧”);

1.3使用jquery . extend(object);

Java代碼

jquery . extend ({

foo:function(){

alert(‘這是壹個測試。這只是壹次測試。);

},

條形:函數(參數){

alert(“此函數接受壹個參數,該參數為““+ param +““。“);

}

});

1.4使用命名空間

雖然在jQuery名稱空間中,我們禁止使用大量的javaScript函數名和變量名。然而,仍然不可避免的是,壹些函數或變量名會與其他jQuery插件沖突,因此我們習慣於將壹些方法封裝到另壹個自定義名稱空間中。

Java代碼

jQuery.myPlugin = {

foo:function(){

alert(‘這是壹個測試。這只是壹次測試。);

},

條形:函數(參數){

alert(“此函數接受壹個參數,該參數為““+ param +““。“);

}

};

使用名稱空間的函數仍然是全局函數,調用它們時使用的方法有:

$。my plugin。foo();

$。my plugin。bar(‘baz‘);

通過這種技術(使用獨立的插件名稱),我們可以避免名稱空間中的函數沖突。

2.對象級插件開發

對象級插件開發需要以下兩種形式:,

表格1:

Java代碼

(函數($){

$。fn。extend ({

插件名:函數(選項,回調){

//我們的插件實現代碼在這裏。

}

})

})(jQuery);

表格2:

Java代碼

(函數($) {

$。fn。plugin name = function(){

//我們的插件實現代碼在這裏。

};

})(jQuery);

上面定義了壹個jQuery函數,形參是$。函數定義完成後,傳入參數jQuery,並立即調用它來執行。這樣做的好處是,當我們編寫jQuery插件時,我們也可以使用別名$而不會與prototype沖突。

2.1在JQuery名稱空間下聲明壹個名稱。

這是單個插件的腳本。如果您的腳本包含多個插件或相互矛盾的插件(例如,$。fn。do something()和$。fn。undo something()),那麽您需要聲明多個函數名。然而,通常當我們編寫壹個插件時,我們試圖只使用壹個名稱來包含它的所有內容。我們的示例插件名為“highlight”

Java代碼

$。fn。hi light = function(){

//我們的插件實現代碼在這裏。

};

我們的插件是這樣調用的:

$(‘# my div‘)。hi light();

但是如果我們需要將實現代碼分解成多個函數呢?原因有很多:設計需要;這實現起來更容易或更易讀;它更加面向對象。這真的很麻煩,將函數實現分解為多個函數,而不添加多余的名稱空間。我們能夠做到這壹點是因為我們將函數作為javascript中最基本的類對象來實現和使用。就像其他對象壹樣,函數可以被指定為屬性。因此,我們已經將“highlight”聲明為jQuery的屬性對象,並且我們需要公開的任何其他屬性或函數都可以在“highlight”函數中聲明。稍後繼續。

2.2接受選項參數來控制插件的行為。

讓我們為插件添加指定前景色和背景色的功能。我們可以讓選項像options對象壹樣傳遞給插件函數。例如:

Java代碼

//插件定義

$。fn。hi light =函數(選項){

var默認值= {

前景:“紅色”,

背景:“黃色”

};

//用提供的選項擴展我們的默認選項。

var opts = $。擴展(默認值、選項);

//我們的插件實現代碼在這裏。

};

我們的插件可以這樣命名:

$(‘# my div‘)。hi light ({

前景:“藍色”

});

2.3公開插件的默認設置

我們應該對上面的代碼進行的壹個改進是公開插件的默認設置。這使得插件的用戶更容易用更少的代碼覆蓋和修改插件。接下來,我們開始使用函數對象。

Java代碼

//插件定義

$。fn。hi light =函數(選項){

//用提供的選項擴展我們的默認選項。

//請註意,要擴展的第壹個參數是壹個空對象-

//這是為了防止覆蓋我們的“defaults”對象。

var opts = $。extend({ },$。fn。hi light。defaults,options);

//我們的插件實現代碼在這裏。

};

//插件默認值-作為插件函數的屬性添加

$。fn。hi light。defaults = {

前景:“紅色”,

背景:“黃色”

};

現在用戶可以在他們的腳本中包含這樣壹行:

//這個只需要調用壹次,而且不壹定要在ready塊中調用。

$。fn。hi light。defaults。foreground =‘blue‘;

接下來我們可以像這樣使用插件方法,結果它設置了藍色的前景色:

$(‘# my div‘)。hi light();

如您所見,我們允許用戶以插件的默認前景色編寫壹行代碼。用戶仍然可以在需要時有選擇地覆蓋這些新的默認值:

//覆蓋插件的默認背景顏色。

$。fn。hi light。defaults。foreground =‘blue‘;

// ...

//使用新的默認設置調用插件。

$('.hilightDiv)。hi light();

// ...

//通過將配置參數傳遞給插件方法來覆蓋默認設置。

$(‘# green‘)。hi light ({

前景:“綠色”

});

2.4適當暴露壹些功能

這壹段將以壹種有趣的方式逐步擴展您的插件到前面的代碼(並讓其他人同時擴展您的插件)。例如,在插件的實現中,我們可以定義壹個名為“format”的函數來格式化突出顯示的文本。我們的插件現在看起來像這樣,默認格式方法的實現部分在hiligth函數下。

Java代碼

//插件定義

$。fn。hi light =函數(選項){

//叠代並重新格式化每個匹配的元素

return this . each(function(){

var $ this = $(this);

// ...

var markup = $ this . html();

//調用我們的格式函數

markup = $。fn。hi light。format(markup);

$this.html(標記);

});

};

//定義我們的格式函數

$。fn。hi light。format = function(txt ){

return‘& lt;strong & gt;‘+txt+‘& lt;/strong & gt;‘;

};

通過允許回調函數,我們可以輕松地支持options對象中的其他屬性來覆蓋默認設置。這是修改插件的另壹個極好的方法。這裏顯示的技巧是進壹步有效地公開格式函數,以便可以重新定義它。通過這種技術,其他人可以傳遞他們自己的設置來覆蓋您的插件,換句話說,其他人也可以為您的插件編寫插件。

考慮到我們在本文中構建的無用插件,您可能想知道這些插件何時會有用。壹個真實的例子是循環插件。這個循環插件是壹個滑動顯示插件,可以支持滾動、滑動、漸隱等多種內部轉換。但事實上,沒有辦法定義可能應用於滑動變化的每種類型的效果。這就是這種可擴展性有用的地方。Cycle插件向用戶公開“轉換”對象,並讓他們添加自己的轉換定義。插件中的定義如下:

$。fn。cycle。transitions = {

// ...

};

這種技術使其他人能夠定義轉換設置並將其傳遞給Cycle插件。

2.5保持私人功能的私密性

這種技術非常強大,可以暴露插件的壹部分以進行覆蓋。但是您需要仔細考慮實現中暴露的部分。壹旦公開,您需要記住對參數或語義的任何更改,這可能會破壞向後兼容性。壹般來說,如果您不確定是否要公開特定的函數,那麽您可能不需要這樣做。

那麽,我們如何在不弄亂名稱空間或暴露實現的情況下定義更多的函數呢?這就是閉包的功能。為了演示,我們將在插件中添加另壹個“調試”功能。該調試函數將把選定的元素格式輸出到firebug控制臺。為了創建壹個閉包,我們定義了壹個包裝整個插件的函數。

Java代碼

(函數($) {

//插件定義

$。fn。hi light =函數(選項){

調試(這個);

// ...

};

//用於調試的私有函數

函數調試($ obj ){

if(window . console & amp;& amp窗口。控制臺。日誌)

window . console . log(‘hi light選擇計數:‘+$ obj . size());

};

// ...

})(jQuery);

我們的“debug”方法不能從外部閉包進入,因此它是我們的實現的私有方法。

2.6支持元數據插件。

在您正在編寫的插件的基礎上,添加對元數據插件的支持可以使其更加強大。就我個人而言,我喜歡這個元數據插件,因為它允許您使用壹些“標記”來覆蓋插件選項(這在創建示例時非常有用)。支持它非常簡單。更新:評論裏有壹點優化建議。

Java代碼

$。fn。hi light =函數(選項){

// ...

//在元素叠代之前生成主選項

var opts = $。extend({ },$。fn。hi light。defaults,options);

return this . each(function(){

var $ this = $(this);

//構建元素特定選項

var o = $。meta?$.extend({ },opts,$ this . data()):opts;

// ...

這些變更行做了壹些事情:它測試是否安裝了元數據插件。如果安裝了它,它可以擴展我們的選項對象。通過提取元數據行作為最後壹個參數,它將覆蓋任何其他選項設置。如果我們選擇“標記”,現在我們可以通過“標記”來驅動行為:

調用時可以這樣寫:jquery . foo();或美元。foo();

Java代碼

& lt!-標記-& gt;

& ltdiv class =“hi light { background:‘red‘,foreground:‘white‘}“& gt;

祝您愉快!

& lt/div & gt;

& ltdiv class =“hi light { foreground:‘orange‘}“& gt;

祝您愉快!

& lt/div & gt;

& ltdiv class =“hi light { background:‘green‘}“& gt;

祝您愉快!

& lt/div & gt;

現在我們可以突出顯示哪些div僅使用壹行腳本:

$('.hilight)。hi light();

2.7整合

讓我們用以下代碼結束我們的示例:

Java代碼

//創建壹個閉包

(函數($) {

//插件的定義

$。fn。hi light =函數(選項){

調試(這個);

//在元素叠代之前生成主選項

var opts = $。extend({ },$。fn。hi light。defaults,options);

//叠代並重新格式化每個匹配的元素

return this . each(function(){

$ this = $(this);

//構建元素特定選項

var o = $。meta?$.extend({ },opts,$ this . data()):opts;

//更新元素樣式

$ this . CSS ({

背景色:o.background,

顏色:o .前景

});

var markup = $ this . html();

//調用我們的格式函數

markup = $。fn。hi light。format(markup);

$this.html(標記);

});

};

//私有函數:調試

函數調試($ obj ){

if(window . console & amp;& amp窗口。控制臺。日誌)

window . console . log(‘hi light選擇計數:‘+$ obj . size());

};

//定義公開的格式函數

$。fn。hi light。format = function(txt ){

return‘& lt;strong & gt;‘+txt+‘& lt;/strong & gt;‘;

};

//插件的默認值

$。fn。hi light。defaults = {

前景:“紅色”,

背景:“黃色”

};

//結束

})(jQuery);

這種設計使我能夠創建符合規範的強大插件。我希望它能使妳也這樣做。

3.摘要

JQuery提出了兩種開發插件的方法,即:

jquery . fn . extend(object);向jQuery對象添加壹個方法。

jQuery.extend(對象);擴展jQuery類本身。向類中添加新方法。

3.1 jquery . fn . extend(object);

什麽是fn?看看jQuery代碼,不難發現。

jQuery.fn = jQuery.prototype = {

init:函數(選擇器,上下文){//....

// ......

};

事實證明,jQuery.fn = jQuery.prototype對原型肯定不陌生。雖然javascript沒有明確的類概念,但用類來理解它更方便。JQuery是壹個封裝非常好的類。例如,如果我們使用語句$(“# BTN 1“),我們將生成jQuery類的壹個實例。

jquery . fn . extend(object);jQuery.prototype的擴展是在jQuery類中添加“成員函數”。jQuery類的實例可以使用這個“成員函數”。

例如,我們需要開發壹個插件並制作壹個特殊的編輯框。當它被點擊時,我們將提醒當前編輯框的內容。您可以這樣做:

$。fn。extend ({

alert while click:function(){

$(這個)。單擊(函數(){

alert($(this)。val());

});

}

});

$(“# input 1“)。alertwhilect();//在頁面上:

$(“# input 1“)是壹個jQuery實例。當它調用成員方法alertWhileClick時,它將被擴展。每次點擊都會先彈出當前編輯的內容。

3.2 jQuery.extend(對象);

向jQuery類添加類方法可以理解為添加靜態方法。比如:

$.擴展({

add:函數(a,b){ return a+b;}

});

為jQuery添加壹個“靜態方法”,然後就可以在引入jQuery的地方使用這個方法,$了。添加(3,4);//返回7

——轉自ITeyes,作者gaojiewyh