JqueryUI - 小部件工廠



以前,在 jQuery 中編寫自定義控制元件的唯一方法是擴充套件 $.fn 名稱空間。這對於簡單的小部件非常有效。假設您構建了更多狀態化的小部件,它很快就會變得很麻煩。為了幫助構建小部件的過程,jQuery UI 中引入了小部件工廠,它消除了通常與管理小部件相關的許多樣板程式碼。

jQueryUI 小部件工廠只是一個函式($.widget),它以字串名稱和物件作為引數,並建立一個 jQuery 外掛和一個“類”來封裝其功能。

語法

以下是 jQueryUI 小部件工廠方法的語法:

jQuery.widget( name [, base ], prototype )

name - 它是一個包含名稱空間和小部件名稱(用點分隔)的字串,用於建立小部件。

base - 要從中繼承的基本小部件。這必須是一個可以使用`new`關鍵字例項化的建構函式。預設為jQuery.Widget

prototype - 用作小部件要從中繼承的原型的物件。例如,jQuery UI 有一個“滑鼠”外掛,其餘互動外掛都基於此。為了實現這一點,draggable、droppable等都從滑鼠外掛繼承,如下所示:jQuery.widget( "ui.draggable", $.ui.mouse, {...} ); 如果您不提供此引數,則小部件將直接從“基本小部件”jQuery.Widget繼承(注意小寫“w”jQuery.widget和大寫“W”jQuery.Widget之間的區別)。

基本小部件

基本小部件是小部件工廠使用的小部件。

選項

下表列出了可與基本小部件一起使用的不同選項

序號 選項及描述
1 disabledhide

如果設定為true,則此選項停用小部件。預設值為false

選項 - disabledhide

如果設定為true,則此選項停用小部件。預設值為false

示例

$( ".selector" ).widget({ disabled: true });
2 hide

此選項確定如何對元素的隱藏進行動畫處理。預設值為null

選項 - hide

此選項確定如何對元素的隱藏進行動畫處理。預設值為null

這可以是以下型別:

  • 布林值 - 如果設定為false,則不使用動畫。如果設定為true,則元素將以預設持續時間和預設緩動淡出。

  • 數字 - 元素將以指定的持續時間和預設緩動淡出。

  • 字串 - 元素將使用指定的效果隱藏。

  • 物件 - 如果值為物件,則可以提供effect、delay、durationeasing屬性。

示例

$( ".selector" ).widget({ hide: { effect: "explode", duration: 1000 } });
3 show

此選項確定如何對元素的顯示進行動畫處理。預設值為null

選項 - show

此選項確定如何對元素的顯示進行動畫處理。預設值為null

這可以是以下型別:

  • 布林值 - 如果設定為false,則不使用動畫來顯示元素。如果設定為true,則元素將以預設持續時間和預設緩動淡入。

  • 數字 - 元素將以指定的持續時間和預設緩動淡入。

  • 字串 - 元素將使用指定的效果顯示。

  • 物件 - 如果值為物件,則可以提供effect、delay、durationeasing屬性。

示例

$( ".selector" ).widget({ show: { effect: "explode", duration: 1000 } });

方法

下表列出了可與基本小部件一起使用的不同方法

序號 操作及描述
1 _create()

此方法是小部件的建構函式。沒有引數,但this.elementthis.options已設定。

操作 - _create()

此操作完全銷燬元素的手風琴功能。元素將恢復到其初始化前的狀態。此方法是小部件的建構函式。沒有引數,但this.elementthis.options已設定。

示例

_create: function() {
   this.element.css( "background-color", this.options.color );
}
2 _delay( fn [, delay ] )

此方法在指定的延遲後呼叫提供的函式。返回超時 ID,用於與clearTimeout()一起使用。

操作 - _delay( fn [, delay ] )

此方法在指定的延遲後呼叫提供的函式。返回超時 ID,用於與clearTimeout()一起使用。

示例

this._delay( this._foo, 100 );
3 _destroy()

公共destroy()方法清理所有公共資料、事件等,然後委託給此_destroy()方法進行自定義、特定於小部件的清理。

操作 - _destroy()

公共destroy()方法清理所有公共資料、事件等,然後委託給此_destroy()方法進行自定義、特定於小部件的清理。

示例

_destroy: function() {
   this.element.removeClass( "my-widget" );
}
4 _focusable( element )

此方法設定元素以在聚焦時應用ui-state-focus類。事件處理程式會在銷燬時自動清理。

操作 - _focusable( element )

此方法設定元素以在聚焦時應用ui-state-focus類。事件處理程式會在銷燬時自動清理。

示例

_create: function() {
   this._focusable( this.element.find( ".my-items" ) );
}
5 _getCreateEventData()

所有小部件都會觸發create事件。預設情況下,事件中不提供任何資料,但此方法可以返回一個物件,該物件將作為建立事件的資料傳遞。

操作 - _getCreateEventData()

所有小部件都會觸發create事件。預設情況下,事件中不提供任何資料,但此方法可以返回一個物件,該物件將作為建立事件的資料傳遞。

示例

_getCreateEventData: function() {
   return this.options;
}
6 _getCreateOptions()

此方法允許小部件定義一個自定義方法來定義例項化期間的選項。使用者提供的選項會覆蓋此方法返回的選項,而此方法會覆蓋預設選項。

操作 - _getCreateOptions()

此方法允許小部件定義一個自定義方法來定義例項化期間的選項。使用者提供的選項會覆蓋此方法返回的選項,而此方法會覆蓋預設選項。

示例

_getCreateOptions: function() {
   return { id: this.element.attr( "id" ) };
}
7 _hide( element, option [, callback ] )

此方法立即隱藏元素,使用內建動畫方法或使用自定義效果。有關可能的選項值,請參閱hide選項。

操作 - _hide( element, option [, callback ] )

此方法立即隱藏元素,使用內建動畫方法或使用自定義效果。有關可能的選項值,請參閱hide選項。

示例

this._hide( this.element, this.options.hide, function() {
   $( this ).remove();
});
8 _hoverable( element )

此方法設定元素以在懸停時應用ui-state-hover類。事件處理程式會在銷燬時自動清理。

操作 - _hoverable( element )

此方法設定元素以在懸停時應用ui-state-hover類。事件處理程式會在銷燬時自動清理。

示例

this._hoverable( this.element.find( "div" ) );
9 _init()

任何時候外掛被呼叫時沒有引數或只有一個選項雜湊,小部件就會被初始化;這包括建立小部件時。

操作 - _init()

任何時候外掛被呼叫時沒有引數或只有一個選項雜湊,小部件就會被初始化;這包括建立小部件時。

示例

_init: function() {
   if ( this.options.autoOpen ) {
      this.open();
   }
}
10 _off( element, eventName )

此方法從指定的元素取消繫結事件處理程式。

操作 - _off( element, eventName )

此方法從指定的元素取消繫結事件處理程式。

示例

this._off( this.element, "click" );
11 _on( [suppressDisabledCheck ] [, element ], handlers )

將事件處理程式繫結到指定的元素。透過事件名稱內的選擇器支援委託,例如“click .foo”。

操作 - _on( [suppressDisabledCheck ] [, element ], handlers )

將事件處理程式繫結到指定的元素。透過事件名稱內的選擇器支援委託,例如“click .foo”。

示例

this._on( this.element, {
   "click a": function( event ) {
      event.preventDefault();
   }
});
12 _setOption( key, value )

此方法從_setOptions()方法為每個單獨的選項呼叫。應根據更改更新小部件狀態。

操作 - _setOption( key, value )

此方法從_setOptions()方法為每個單獨的選項呼叫。應根據更改更新小部件狀態。

示例

_setOption: function( key, value ) {
   if ( key === "width" ) {
      this.element.width( value );
   }
   if ( key === "height" ) {
      this.element.height( value );
   }
   this._super( key, value );
}
13 _setOptions( options )

無論option()方法以何種形式呼叫,只要呼叫此方法,就會呼叫此方法。

操作 - _setOptions( options )

無論option()方法以何種形式呼叫,只要呼叫此方法,就會呼叫此方法。

示例

_setOptions: function( options ) {
   var that = this,
   resize = false;
   $.each( options, function( key, value ) {
      that._setOption( key, value );
      if ( key === "height" || key === "width" ) {
         resize = true;
      }
   });
   if ( resize ) {
      this.resize();
   }
}
14 _show( element, option [, callback ] )

立即顯示元素,使用內建動畫方法或使用自定義效果。有關可能的選項值,請參閱show選項。

操作 - _show( element, option [, callback ] )

立即顯示元素,使用內建動畫方法或使用自定義效果。有關可能的選項值,請參閱show選項。

示例

_this._show( this.element, this.options.show, function() {
   // Focus the element when it's fully visible.
   this.focus();
}
15 _super( [arg ] [, ... ] )

此方法使用任何指定的引數呼叫父小部件中同名的方法。本質上是.call()。

操作 - _super( [arg ] [, ... ] )

此方法使用任何指定的引數呼叫父小部件中同名的方法。本質上是.call()。

示例

_setOption: function( key, value ) {
   if ( key === "title" ) {
      this.element.find( "h3" ).text( value );
   }
   this._super( key, value );
}
16 _superApply( arguments )

使用引數陣列呼叫父小部件中同名的方法。

操作 - _superApply( arguments )

使用引數陣列呼叫父小部件中同名的方法。

示例

_setOption: function( key, value ) {
   if ( key === "title" ) {
      this.element.find( "h3" ).text( value );
   }
   this._superApply( arguments );
}
17 _trigger( type [, event ] [, data ] )

此方法觸發事件及其關聯的回撥。名稱等於type的選項被呼叫為回撥。

操作 - _trigger( type [, event ] [, data ] )

此方法觸發事件及其關聯的回撥。名稱等於type的選項被呼叫為回撥。

示例

this._on( this.element, {
   keydown: function( event ) {
      // Pass the original event so that the custom search event has
      // useful information, such as keyCode
      this._trigger( "search", event, {
         // Pass additional information unique to this event
         value: this.element.val()
      });
   }
});
18 destroy()

此方法完全刪除小部件功能。這會將元素恢復到其初始化前的狀態。

操作 - destroy()

此方法完全刪除小部件功能。這會將元素恢復到其初始化前的狀態。

示例

this._on( this.element, {
   "click a": function( event ) {
      event.preventDefault();
      this.destroy();
   }
});
19 disable()

此方法停用小部件。

操作 - disable()

此方法停用小部件。

示例

this._on( this.element, {
   "click a": function( event ) {
      event.preventDefault();
      this.disable();
   }
});
20 enable()

此方法啟用小部件。

操作 - enable()

此方法啟用小部件。

示例

this._on( this.element, {
   "click a": function( event ) {
      event.preventDefault();
      this.enable();
   }
});
21 option( optionName )

此方法獲取當前與指定optionName關聯的值。

操作 - option( optionName )

此方法獲取當前與指定optionName關聯的值。

示例

this.option( "width" );
22 option()

此方法獲取一個包含鍵/值對的物件,這些鍵/值對錶示當前的小部件選項雜湊。

操作 - option()

此方法獲取一個包含鍵/值對的物件,這些鍵/值對錶示當前的小部件選項雜湊。

示例

var options = this.option();
for ( var key in options ) {
   console.log( key, options[ key ] );
}
23 option( optionName, value )

此方法設定與指定optionName關聯的小部件選項的值。

操作 - option( optionName, value )

此方法設定與指定optionName關聯的小部件選項的值。

示例

this.option( "width", 500 );
24 option( options )

此方法設定小部件的一個或多個選項。

操作 - option( options )

此方法設定小部件的一個或多個選項。

示例

this.option({
   width: 500,
   height: 500
});
25 widget()

此方法返回一個包含原始元素或其他相關生成元素的 jQuery 物件。

操作 - widget()

此方法返回一個包含原始元素或其他相關生成元素的 jQuery 物件。

示例

_create: function() {
   this.widget().css( "border", "2px solid red" );
}

事件

序號 事件方法及描述
1 create( event, ui )

此事件在建立小部件時觸發。

事件 - create( event, ui )

此事件在建立小部件時觸發。其中event的型別為Eventui的型別為Object

語法

$( ".selector" ).widget({
   create: function( event, ui ) {}
});

jQueryUI 小部件工廠生命週期

jQueryUI 小部件工廠提供了一種面向物件的方式來管理小部件的生命週期。這些生命週期活動包括:

建立和銷燬小部件:例如,

$( "#elem" ).progressbar();

更改小部件選項:例如

$( "#elem" ).progressbar({ value: 20 });

在子類化的小部件中進行“超級”呼叫:例如

$( "#elem" ).progressbar( "value" );
or 
$( "#elem" ).progressbar( "value", 40 );

事件通知:例如

$( "#elem" ).bind( "progressbarchange", function() {
   alert( "The value has changed!" );
});

示例

現在讓我們在下面的示例中建立一個自定義小部件。我們將建立一個按鈕小部件。在以下示例中,我們將看到如何在小部件中建立選項、方法和事件:

建立自定義小部件

讓我們首先建立一個簡單自定義小部件。

<!DOCTYPE html>
<html>
   <head>
      <meta charset = "utf-8">
      <title>jQuery UI Widget - Default functionality</title>
      <link rel = "stylesheet" href = "//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css">
      <script src = "https://code.jquery.com/jquery-1.10.2.js"></script>
      <script src = "https://code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
      
      <script>
         $(function() {
            $.widget("iP.myButton", {
               _create: function() { 
                  this._button = $("<button>"); 
                  this._button.text("My first Widget Button");
                  this._button.width(this.options.width) 
                  this._button.css("background-color", this.options.color);    
                  this._button.css("position", "absolute");   
                  this._button.css("left", "100px");            
                  $(this.element).append(this._button);
               },
            });
            $("#button1").myButton();
         });
      </script>
   </head>
   
   <body>
      <div id = "button1"></div>
   </body>
</html>

讓我們將以上程式碼儲存在一個 HTML 檔案widgetfactoryexample.htm中,並在支援 javascript 的標準瀏覽器中開啟它,您還應該看到以下輸出:

向自定義小部件新增選項

在前面的示例中,我們使用了_create函式來建立自定義控制元件。但使用者通常希望透過設定和修改選項來自定義控制元件。我們可以定義一個選項物件,該物件儲存所有定義選項的預設值。_setOption函式用於此目的。它用於使用者設定的每個單獨選項。這裡我們正在設定按鈕的widthbackground-color

<!DOCTYPE html>
<html>
   <head>
      <meta charset = "utf-8">
      <title>jQuery UI Widget - Default functionality</title>
      <link rel = "stylesheet" href = "//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css">
      <script src = "https://code.jquery.com/jquery-1.10.2.js"></script>
      <script src = "https://code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
      
      <script>
         $(function() {
            $.widget("iP.myButton", {
               _create: function() { 
                  this._button = $("<button>"); 
                  this._button.text("My first Widget Button");
                  this._button.width(this.options.width) 
                  this._button.css("background-color", this.options.color);    
                  this._button.css("position", "absolute");   
                  this._button.css("left", "100px");            
                  $(this.element).append(this._button);
               },
               _setOption: function(key, value) { 
                  switch (key) { 
                     case "width": 
                     this._button.width(value); 
                     break; 
                     case "color":
                     this._button.css("background-color",value);
                     break; 
                  } 
               },
            });
            $("#button2").myButton();
            $("#button2").myButton("option", {width:100,color:"#cedc98"});
         });
      </script>
   </head>
   
   <body>
      <div id = "button2"></div>
   </body>
</html>

讓我們將以上程式碼儲存在一個 HTML 檔案widgetfactoryexample.htm中,並在支援 javascript 的標準瀏覽器中開啟它,您還應該看到以下輸出:

向自定義小部件新增方法

在以下示例中,我們將新增使用者可以利用的方法,這些方法非常易於構建到框架中。我們將編寫一個Move方法,該方法將按鈕向指定的水平距離移動。為了使此方法生效,我們還需要在_create函式中設定position和left屬性 -

this._button.css("position", "absolute");   
this._button.css("left", "100px");  

此後,使用者現在可以以通常的jQuery UI方式呼叫您的方法 -

this._button.css("position", "absolute");   
this._button.css("left", "100px");  
$("button3").myButton("move", 200);
<!DOCTYPE html>
<html>
   <head>
      <meta charset = "utf-8">
      <title>jQuery UI Widget - Default functionality</title>
      <link rel = "stylesheet" href = "//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css">
      <script src = "https://code.jquery.com/jquery-1.10.2.js"></script>
      <script src = "https://code.jquery.com/ui/1.10.4/jquery-ui.js"></script>

      <script>
         $(function() {
            $.widget("iP.myButton", {
               _create: function() { 
                  this._button = $("<button>"); 
                  this._button.text("My first Widget Button");
                  this._button.width(this.options.width) 
                  this._button.css("background-color", this.options.color);    
                  this._button.css("position", "absolute");   
                  this._button.css("left", "100px");            
                  $(this.element).append(this._button);
               },
         
               move: function(dx) { 
                  var x = dx + parseInt(this._button.css("left")); 
                  this._button.css("left", x); 
                  if(x>400) { this._trigger("outbounds",{},  {position:x}); }
               }
            });
            $("#button3").myButton();
            $("#button3").myButton("move", 200);
         });
      </script>
   </head>
   
   <body>
      <div id = "button3"></div>
   </body>
</html>

讓我們將以上程式碼儲存在一個 HTML 檔案widgetfactoryexample.htm中,並在支援 javascript 的標準瀏覽器中開啟它,您還應該看到以下輸出:

向自定義小部件新增事件

在此示例中,我們將演示如何建立事件。要建立事件,您只需使用_trigger方法即可。第一個引數是事件的名稱,第二個是您想要傳遞的任何標準事件物件,第三個是您想要傳遞的任何自定義事件物件。

這裡我們在按鈕移動到x=400以外時觸發一個事件。您只需新增到move函式中 -

if(x<400) { this._trigger("outbounds",{}, {position:x}); }

在這種情況下,事件稱為outbounds,並傳遞了一個空事件物件和一個自定義事件物件,該物件僅將位置作為其唯一屬性。

整個move函式為 -

move: function(dx) {
   var x = dx + parseInt(this._button.css("left")); 
   this._button.css("left", x); 
   if(x<400) { this._trigger("outbounds",{}, {position:x}); }
}

使用者可以透過簡單地定義相同名稱的選項來設定事件處理函式。

$("button4").myButton("option", {
   width: 100, 
   color: "red",
   outbounds:function(e,ui) {
      alert(ui.position);}
});
<!DOCTYPE html>
<html>
   <head>
      <meta charset = "utf-8">
      <title>jQuery UI Widget - Default functionality</title>
      <link rel = "stylesheet" href = "//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css">
      <script src = "https://code.jquery.com/jquery-1.10.2.js"></script>
      <script src = "https://code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
      
      <script>
         $(function() {
            $.widget("iP.myButton", {
               _create: function() { 
                  this._button = $("<button>"); 
                  this._button.text("My first Widget Button");
                  this._button.width(this.options.width) 
                  this._button.css("background-color", this.options.color);    
                  this._button.css("position", "absolute");   
                  this._button.css("left", "100px");            
                  $(this.element).append(this._button);
               },
               move: function(dx) { 
                  var x = dx + parseInt(this._button.css("left")); 
                  this._button.css("left", x); 
                  if(x>400) { this._trigger("outbounds",{},  {position:x}); }
               }
            });
            $("#button4").myButton();
            $("#button4").on("mybuttonoutbounds", function(e, ui) {
               alert("out");
            });
            $("#button4").myButton("move", 500);
         });
      </script>
   </head>
   
   <body>
      <div id = "button4"></div>
   </body>
</html>

讓我們將以上程式碼儲存在一個HTML檔案widgetfactoryexample.htm中,並在支援javascript的標準瀏覽器中開啟它,就會彈出一個警示框。

廣告

© . All rights reserved.