1. 程式人生 > >jquery ----> How to Create a Basic Plugin (翻譯)

jquery ----> How to Create a Basic Plugin (翻譯)

app sed 設置 函數表 col 有變 動作 jquery對象 別名

http://learn.jquery.com/plugins/basic-plugin-creation/

如何創建一個基本的插件

有時候你想在整個代碼中提供一些功能。 例如,也許你想要一個單一的方法,你可以調用一個jQuery selection來對selection執行一系列操作。 在這種情況下,您可能需要編寫一個插件。

jQuery如何工作101:jQuery對象方法

在我們編寫自己的插件之前,我們必須先了解一下jQuery的工作原理。 看看這個代碼:

1 $( "a" ).css( "color", "red" );

這是一些非常基本的jQuery代碼,但是你知道幕後發生了什麽嗎? 無論何時使用$函數選擇元素,它都會返回一個jQuery對象。 該對象包含所有您使用的方法(.css(),.click()等)以及適合您選擇器的所有元素。 jQuery對象從$ .fn對象中獲取這些方法。 這個對象包含了所有的jQuery對象方法,如果我們想寫我們自己的方法,它也需要包含這些方法。

基本插件創作

假設我們要創建一個插件,使得一組檢索元素中的文本呈綠色。 我們所要做的就是將一個名為greenify的函數添加到$ .fn中,並且它將像其他任何jQuery對象方法一樣可用。

1 $.fn.greenify = function() {
2     this.css( "color", "green" );
3 };
4  
5 $( "a" ).greenify(); // Makes all the links green.
6 //使所有的鏈接變成綠色

註意,要使用另一種方法.css(),我們使用 this,而不是$(this)。 這是因為我們的greenify 函數是與.css()相同對象的一部分。

鏈接

這很有效,但是我們需要為我們的插件在現實世界中生存而做一些事情。 當你將五個或六個動作鏈接到一個選擇器上時,jQuery的一個特性就是鏈接。 這是通過讓所有jQuery對象方法再次返回原始jQuery對象來實現的(有一些例外:調用.width()而不帶參數返回所選元素的寬度,並且不可鏈接)。 使我們的插件方法可鏈接需要一行代碼:

1 $.fn.greenify = function() {
2     this.css( "color", "green" );
3     return this;
4 }
5  
6 $( "a" ).greenify().addClass( "greenified" );

保護$ 別名並添加範圍

$變量在JavaScript庫中非常受歡迎,如果您使用jQuery另一個庫,則必須使jQuery不使用帶有jQuery.noConflict()的$。 但是,這會破壞我們的插件,因為它是在假設$是jQuery函數的別名的情況下編寫的。 為了與其他插件一起使用,並且仍然使用jQuery $別名,我們需要將所有代碼放入立即調用的函數表達式中,然後傳遞函數jQuery,並將參數命名為$:

1 (function ( $ ) {
2  
3     $.fn.greenify = function() {
4         this.css( "color", "green" );
5         return this;
6     };
7  
8 }( jQuery ));

此外,立即調用函數的主要目的是允許我們擁有自己的私有變量。假設我們想要一個不同的綠色,我們想把它存儲在一個變量中。

 1 (function ( $ ) {
 2  
 3     var shade = "#556b2f";
 4  
 5     $.fn.greenify = function() {
 6         this.css( "color", shade );
 7         return this;
 8     };
 9  
10 }( jQuery ));

最小化插件封裝

編寫插件只需占用$ .fn中的一個插槽是一種很好的做法。 這樣既減少了插件被覆蓋的機會,也減少了插件覆蓋其他插件的機會。 換句話說,這很糟糕:

 1 (function( $ ) {
 2  
 3     $.fn.openPopup = function() {
 4         // Open popup code.
 5     };
 6  
 7     $.fn.closePopup = function() {
 8         // Close popup code.
 9     };
10  
11 }( jQuery ));

擁有一個插槽會更好,並使用參數來控制一個插槽執行的操作。

 1 (function( $ ) {
 2  
 3     $.fn.popup = function( action ) {
 4  
 5         if ( action === "open") {
 6             // Open popup code.
 7         }
 8  
 9         if ( action === "close" ) {
10             // Close popup code.
11         }
12  
13     };
14  
15 }( jQuery ));

使用each()方法

典型的jQuery對象將包含對任意數量DOM元素的引用,這就是為什麽jQuery對象通常被稱為集合。 如果您想對特定元素進行任何操作(例如獲取數據屬性,計算特定位置),那麽您需要使用.each()來遍歷元素。

1 $.fn.myNewPlugin = function() {
2  
3     return this.each(function() {
4         // Do something to each element here.  // 在這裏為每個元素做點事情。
5     });
6  
7 };

註意,我們返回.each()的結果而不是返回this結果。 由於.each()已經是可鏈接的,它返回this,然後我們返回。 這是維持可持續性的一種比迄今為止我們所做的更好的方法。

接受選項

隨著你的插件變得越來越復雜,通過接受選項讓你的插件可定制是一個好主意。 最簡單的方法是使用對象字面值,特別是如果有很多選項的話。 讓我們改變我們的綠化插件接受一些選項。

 1 (function ( $ ) {
 2  
 3     $.fn.greenify = function( options ) {
 4  
 5         // This is the easiest way to have default options. // 這是擁有默認選項的最簡單方法。
 6         var settings = $.extend({
 7             // These are the defaults. // 這些是默認設置。
 8             color: "#556b2f",
 9             backgroundColor: "white"
10         }, options );
11  
12         // Greenify the collection based on the settings variable. //根據設置變量使集合變綠。
13         return this.css({
14             color: settings.color,
15             backgroundColor: settings.backgroundColor
16         });
17  
18     };
19  
20 }( jQuery ));

示例:

1 $( "div" ).greenify({
2     color: "orange"
3 });

#556b2f的顏色默認值被$ .extend()覆蓋為橙色。

把它放在一起

下面是使用我們討論過的一些技巧的一個小插件的例子:

 1 (function( $ ) {
 2  
 3     $.fn.showLinkLocation = function() {
 4  
 5         this.filter( "a" ).each(function() {
 6             var link = $( this );
 7             link.append( " (" + link.attr( "href" ) + ")" );
 8         });
 9  
10         return this;
11  
12     };
13  
14 }( jQuery ));
15  
16 // Usage example:
17 $( "a" ).showLinkLocation();

這個方便的插件遍歷集合中的所有錨,並在括號中追加href屬性。

1 <!-- Before plugin is called: -->
2 <a href="page.html">Foo</a>
3  
4 <!-- After plugin is called: -->
5 <a href="page.html">Foo (page.html)</a>

我們的插件可以優化,但:

 1 (function( $ ) {
 2  
 3     $.fn.showLinkLocation = function() {
 4  
 5         this.filter( "a" ).append(function() {
 6             return " (" + this.href + ")";
 7         });
 8  
 9         return this;
10  
11     };
12  
13 }( jQuery ));

我們使用.append()方法的功能來接受回調,並且該回調的返回值將決定集合中每個元素的附加內容。 另請註意,我們沒有使用.attr()方法來檢索href屬性,因為本地DOM API使我們可以輕松訪問具有恰當名稱的href屬性。

jquery ----> How to Create a Basic Plugin (翻譯)