jQuery UI API - 部件庫(Widget Factory)
所屬類別
實用工具(Utilities) | 小部件(Widgets)
jQuery.widget( name [, base ], prototype ) 用法
描述:使用與所有 jQuery UI 小部件相同的抽象化來創(chuàng)建有狀態(tài)的 jQuery 插件。
參數(shù) | 類型 | 類型 |
---|---|---|
name | String | 要創(chuàng)建的小部件名稱,包括命名空間。 |
base | Function() | 要繼承的基礎(chǔ)小部件。必須是一個可以使用 `new` 關(guān)鍵詞實例化的構(gòu)造函數(shù)。默認為 jQuery.Widget。 |
prototype | PlainObject | 要作為小部件原型使用的對象。 |
您可以使用 $.Widget
對象作為要繼承的基礎(chǔ),或者可以明確地從現(xiàn)有的 jQuery UI 或第三方控件,從頭開始創(chuàng)建新的小部件。定義一個帶有相同名稱的小部件來繼承基礎(chǔ)部件,甚至允許您適當(dāng)?shù)財U展小部件。
jQuery UI 中包含許多保持狀態(tài)的小部件,因此比典型的 jQuery 插件稍有不同的使用模式。所有的jQuery UI 小部件使用相同的模式,這是由部件庫(Widget Factory)定義的。所以,只要您學(xué)會使用其中一個,您就知道如何使用其他的小部件(Widget)。
注釋:本章節(jié)使用 進度條部件(Progressbar Widget) 演示實例,但是語法適用于每個小部件。
初始化
為了跟蹤小部件的狀態(tài),我們必須引入小部件的全生命周期。小部件初始化時生命周期開始。要初始化一個小部件,我們只需要簡單地在一個或多個元素上調(diào)用插件。
$( "#elem" ).progressbar();
這將初始化 jQuery 對象中的每個元素。上面實例中元素 id 為 "elem"
。
選項
由于 progressbar()
調(diào)用時不帶參數(shù),小部件是使用默認選項進行初始化的。我們可以在初始化時傳遞一組選項來覆蓋默認選項:
$( "#elem" ).progressbar({ value: 20 });
我們可以根據(jù)需要傳遞選項的個數(shù),任何我們未傳遞的選項都使用它們的默認值。
您可以傳遞多個選項參數(shù),這些參數(shù)將會被合并為一個對象(類似于 $.extend( true, target, object1, objectN )
)。這在為所有實例覆蓋一些設(shè)置,實例間共享選項時很有用:
var options = { modal: true, show: "slow" }; $( "#dialog1" ).dialog( options ); $( "#dialog2" ).dialog( options, { autoOpen: false });
所有在初始化時傳遞的選項都是深拷貝的,確保后續(xù)在不影響小部件的情況下修改對象。數(shù)組是唯一的例外,它們是按原樣引用的。這個例外是為了適當(dāng)?shù)刂С謹?shù)據(jù)綁定,其中數(shù)據(jù)源必須作為引用。
默認值保存在小部件的屬性中,因此我們可以覆蓋 jQuery UI 設(shè)置的值。例如,在下面的設(shè)置后,所有將來的進度條實例將默認為值 80:
$.ui.progressbar.prototype.options.value = 80;
選項是小部件狀態(tài)的組成部分,所以我們也可以在初始化后設(shè)置選項。我們會在后續(xù)看到 option 方法。
方法
現(xiàn)在小部件已經(jīng)初始化,我們可以查詢它的狀態(tài),或者在小部件上執(zhí)行動作。所有初始化后的動作都是以方法調(diào)用方式執(zhí)行。為了在小部件上調(diào)用一個方法,我們向 jQuery 插件傳遞方法的名稱。例如,在進度條部件(Progressbar Widget)上調(diào)用 value()
方法,我們可以使用:
$( "#elem" ).progressbar( "value" );
如果方法接受參數(shù),我們可以在方法名稱后傳遞參數(shù)。例如,要傳遞參數(shù) 40
到 value()
方法,我們可以使用:
$( "#elem" ).progressbar( "value", 40 );
就像 jQuery 中的其他方法,大多數(shù)的小部件方法返回 jQuery 對象:
$( "#elem" ) .progressbar( "value", 90 ) .addClass( "almost-done" );
每個小部件都有自己的方法設(shè)置,這些設(shè)置是基于小部件提供的功能。但是,有一些方法是存在于所有的小部件上,這會在下面進行詳細講解。
事件
所有的小部件都有與它們各種行為相關(guān)的事件,以便在狀態(tài)改變的時候通知您。對于大多數(shù)的小部件,當(dāng)事件被觸發(fā)時,名稱以小部件名稱的小寫字母形式作為前綴。例如,我們可以綁定進度條的 change
事件,該事件在值改變時觸發(fā)。
$( "#elem" ).bind( "progressbarchange", function() { alert( "The value has changed!" ); });
每個事件都有一個對應(yīng)的回調(diào),這會作為選項。如果需要,我們可以抓住進度條的 change
回調(diào),而不用綁定 progressbarchange
事件。
$( "#elem" ).progressbar({ change: function() { alert( "The value has changed!" ); } });
所有的小部件都有一個 change
事件,該事件在實例化時觸發(fā)。
實例化
小部件的實例是使用帶有小部件全稱作為鍵的 jQuery.data()
存儲的。因此,您可以使用下面代碼從元素檢索進度條部件(Progressbar Widget)的實例對象。
$( "#elem" ).data( "ui-progressbar" );
元素是否綁定了給定小部件,可以使用 :data
選擇器來檢測。
$( "#elem" ).is( ":data( 'ui-progressbar' )" ); // true $( "#elem" ).is( ":data( 'ui-draggable' )" ); // false
您也可以使用 :data
來獲得作為給定小部件實例的所有元素的列表。
$( ":data( 'ui-progressbar' )" );
屬性
所有的小部件都有下面的屬性:
- defaultElement:當(dāng)構(gòu)造小部件實例未提供元素時要使用的元素。例如,由于進度條的
defaultElement
是"<div>
",$.ui.progressbar({ value: 50 })
在一個新建的<div>
上實例化進度條小部件實例。 - document:其內(nèi)包含小部件元素的
document
。如果需要在框架內(nèi)與小部件進行交互時很有用。 - element:一個 jQuery 對象,包含用于實例化小部件的 元素。如果您選擇多個元素并調(diào)用
.myWidget()
,將為每個元素創(chuàng)建一個單獨的小部件實例。因此,該屬性總是包含一個元素。 - namespace:小部件原型存儲的全局 jQuery 對象的位置。例如,
"ui"
的namespace
表示小部件原型存儲在$.ui
。 - options:一個包含小部件當(dāng)前使用選項的對象。在實例化時,用戶提供的任何選項將會自動與
$.myNamespace.myWidget.prototype.options
中定義的默認值合并。用戶指定的選項會覆蓋默認值。 - uuid:一個表示控件標(biāo)識符的唯一整數(shù)。
- version:小部件的字符串版本。對于 jQuery UI 小部件,該屬性會被設(shè)置為小部件使用的 jQuery UI 的版本。插件開發(fā)者必須在他們的原型中明確設(shè)置該屬性。
- widgetEventPrefix:添加到小部件事件名稱的前綴。例如,可拖拽小部件(Draggable Widget) 的
widgetEventPrefix
是"drag"
,因此當(dāng)創(chuàng)建一個 draggable 時,事件的名稱是"dragcreate"
。默認情況下,小部件的widgetEventPrefix
是它的名稱。注意:該屬性已被廢棄,將在以后的版本中非常。事件名稱將被改為 widgetName:eventName (例如"draggable:create"
)。 - widgetFullName:包含命名空間的小部件全稱。對于
$.widget( "myNamespace.myWidget", {} )
,widgetFullName
將是"myNamespace-myWidget"
。 - widgetName:小部件的名稱。對于
$.widget( "myNamespace.myWidget", {} )
,widgetName
將是"myWidget"
。 - window:其內(nèi)包含小部件元素的
window
。如果需要在框架內(nèi)與小部件進行交互時很有用。
jQuery.Widget 基礎(chǔ)小部件用法
描述:部件庫(Widget Factory)使用的基礎(chǔ)小部件。
快速導(dǎo)航
選項 | 方法 | 事件 |
---|---|---|
選項 | 類型 | 描述 | 默認值 |
---|---|---|---|
disabled | Boolean | 如果設(shè)置為 true ,則禁用該小部件。代碼實例: 初始化帶有指定 $( ".selector" ).widget({ disabled: true }); 在初始化后,獲取或設(shè)置 // getter var disabled = $( ".selector" ).widget( "option", "disabled" ); // setter $( ".selector" ).widget( "option", "disabled", true ); |
false |
hide | Boolean 或 Number 或 String 或 Object | 是否使用動畫隱藏元素,以及如何動畫隱藏元素。 支持多個類型:
代碼實例: 初始化帶有指定 $( ".selector" ).widget({ hide: { effect: "explode", duration: 1000 } }); 在初始化后,獲取或設(shè)置 // getter var hide = $( ".selector" ).widget( "option", "hide" ); // setter $( ".selector" ).widget( "option", "hide", { effect: "explode", duration: 1000 } ); |
null |
show | Boolean 或 Number 或 String 或 Object | 是否使用動畫顯示元素,以及如何動畫顯示元素。 支持多個類型:
代碼實例: 初始化帶有指定 $( ".selector" ).widget({ show: { effect: "blind", duration: 800 } }); 在初始化后,獲取或設(shè)置 // getter var show = $( ".selector" ).widget( "option", "show" ); // setter $( ".selector" ).widget( "option", "show", { effect: "blind", duration: 800 } ); |
null |
方法 | 返回 | 描述 |
---|---|---|
_create() | jQuery (plugin only) | _create() 方法是小部件的構(gòu)造函數(shù)。沒有參數(shù),但是 this.element 和 this.options 已經(jīng)設(shè)置。
代碼實例: 基于一個選項設(shè)置小部件元素的背景顏色。 _create: function() { this.element.css( "background-color", this.options.color ); } |
_delay( fn [, delay ] ) | Number | 在指定延遲后調(diào)用提供的函數(shù)。保持 this 上下文正確。本質(zhì)上是 setTimeout() 。使用 clearTimeout() 返回超時 ID。
代碼實例: 100 毫秒后在小部件上調(diào)用 this._delay( this._foo, 100 ); |
_destroy() | jQuery (plugin only) | 公共的 destroy() 方法清除所有的公共數(shù)據(jù)、事件等等。代表了定制、指定小部件、清理的 _destroy() 。
代碼實例: 當(dāng)小部件被銷毀時,從小部件的元素移除一個 class。 _destroy: function() { this.element.removeClass( "my-widget" ); } |
_focusable( element ) | jQuery (plugin only) | 建立聚焦在元素上時要應(yīng)用 ui-state-focus class 的 element 。
代碼實例: 向小部件內(nèi)的一組元素應(yīng)用 focusable 樣式: this._focusable( this.element.find( ".my-items" ) ); |
_getCreateEventData() | Object | 所有的小部件觸發(fā) create 事件。默認情況下,事件中不提供任何的數(shù)據(jù),但是該方法會返回一個對象,作為 create 事件的數(shù)據(jù)被傳遞。
代碼實例: 向 _getCreateEventData: function() { return this.options; } |
_getCreateOptions() | Object | 該方法允許小部件在初始化期間為定義選項定義一個自定義的方法。用戶提供的選項會覆蓋該方法返回的選項,即會覆蓋默認的選項。
代碼實例: 讓小部件元素的 id 屬性作為選項可用。 _getCreateOptions: function() { return { id: this.element.attr( "id" ) }; } |
_hide( element, option [, callback ] ) | jQuery (plugin only) | 使用內(nèi)置的動畫方法或使用自定義的特效隱藏一個元素。如需了解可能的 option 值,請查看 hide。
代碼實例: 為自定義動畫傳遞 this._hide( this.element, this.options.hide, function() { // Remove the element from the DOM when it's fully hidden. $( this ).remove(); }); |
_hoverable( element ) | jQuery (plugin only) | 建立懸浮在元素上時要應(yīng)用 ui-state-hover class 的 element 。事件處理程序在銷毀時自動清理。
代碼實例: 當(dāng)懸浮在元素上時,向元素內(nèi)所有的 this._hoverable( this.element.find( "div" ) ); |
_init() | jQuery (plugin only) | 小部件初始化的理念與創(chuàng)建不同。任何時候不帶參數(shù)的調(diào)用插件或者只帶一個選項哈希的調(diào)用插件,初始化小部件。當(dāng)小部件被創(chuàng)建時會包含這個方法。
注釋:如果存在不帶參數(shù)成功調(diào)用小部件時要執(zhí)行的邏輯動作,初始化只能在這時處理。
代碼實例: 如果設(shè)置了 _init: function() { if ( this.options.autoOpen ) { this.open(); } } |
_off( element, eventName ) | jQuery (plugin only) | 從指定的元素取消綁定事件處理程序。
代碼實例: 從小部件的元素上取消綁定所有 click 事件。 this._off( this.element, "click" ); |
_on( [suppressDisabledCheck ] [, element ], handlers ) | jQuery (plugin only) | 授權(quán)通過事件名稱內(nèi)的選擇器被支持,例如 "click .foo" 。_on() 方法提供了一些直接事件綁定的好處:
代碼實例: 放置小部件元素內(nèi)所有被點擊的鏈接的默認行為。 this._on( this.element, { "click a": function( event ) { event.preventDefault(); } }); |
_setOption( key, value ) | jQuery (plugin only) | 為每個獨立的選項調(diào)用 _setOptions() 方法。小部件狀態(tài)隨著改變而更新。
代碼實例: 當(dāng)小部件的 _setOption: function( key, value ) { if ( key === "width" ) { this.element.width( value ); } if ( key === "height" ) { this.element.height( value ); } this._super( key, value ); } |
_setOptions( options ) | jQuery (plugin only) | 當(dāng)調(diào)用 option() 方法時調(diào)用,無論以什么形式調(diào)用 option() 。如果您要根據(jù)多個選項的改變而改變處理器密集型,重載該方法是很有用的。
代碼實例: 如果小部件的 _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(); } } |
_show( element, option [, callback ] ) | jQuery (plugin only) | 使用內(nèi)置的動畫方法或使用自定義的特效顯示一個元素。如需了解可能的 option 值,請查看 show。
代碼實例: 為自定義動畫傳遞 this._show( this.element, this.options.show, function() { // Focus the element when it's fully visible. this.focus(); } |
_super( [arg ] [, ... ] ) | jQuery (plugin only) | 從父部件中調(diào)用相同名稱的方法,帶有任意指定的參數(shù)。本質(zhì)上是 .call() 。
代碼實例: 處理 _setOption: function( key, value ) { if ( key === "title" ) { this.element.find( "h3" ).text( value ); } this._super( key, value ); } |
_superApply( arguments ) | jQuery (plugin only) | 從父部件中調(diào)用相同名稱的方法,帶有參數(shù)的數(shù)組。本質(zhì)上是 .apply() 。
代碼實例: 處理 _setOption: function( key, value ) { if ( key === "title" ) { this.element.find( "h3" ).text( value ); } this._superApply( arguments ); } |
_trigger( type [, event ] [, data ] ) | Boolean | 觸發(fā)一個事件及其相關(guān)的回調(diào)。帶有該名稱的選項與作為回調(diào)被調(diào)用的類型相等。 事件名稱是小部件名稱和類型的小寫字母串。 注釋:當(dāng)提供數(shù)據(jù)時,您必須提供所有三個參數(shù)。如果沒有傳遞事件,則傳遞 如果默認行為是阻止的,則返回
代碼實例: 當(dāng)按下一個鍵時,觸發(fā) 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() }); } }); |
destroy() | jQuery (plugin only) | 完全移除小部件功能。這會把元素返回到它的預(yù)初始化狀態(tài)。
代碼實例: 當(dāng)點擊小部件的任意錨點時銷毀小部件。 this._on( this.element, { "click a": function( event ) { event.preventDefault(); this.destroy(); } }); |
disable() | jQuery (plugin only) | 禁用小部件。
代碼實例: 當(dāng)點擊小部件的任意錨點時禁用小部件。 this._on( this.element, { "click a": function( event ) { event.preventDefault(); this.disable(); } }); |
enable() | jQuery (plugin only) | 啟用小部件。
代碼實例: 當(dāng)點擊小部件的任意錨點時啟用小部件。 this._on( this.element, { "click a": function( event ) { event.preventDefault(); this.enable(); } }); |
option( optionName ) | Object | 獲取當(dāng)前與指定的 optionName 關(guān)聯(lián)的值。
代碼實例: 獲得 this.option( "width" ); |
option() | PlainObject | 獲取一個包含鍵/值對的對象,鍵/值對表示當(dāng)前小部件選項哈希。
代碼實例: 記錄每個小部件選項的鍵/值對,用于調(diào)試。 var options = this.option(); for ( var key in options ) { console.log( key, options[ key ] ); } |
option( optionName, value ) | jQuery (plugin only) | 設(shè)置與指定的 optionName 關(guān)聯(lián)的小部件選項的值。
代碼實例: 設(shè)置 this.option( "width", 500 ); |
option( options ) | jQuery (plugin only) | 為小部件設(shè)置一個或多個選項。
代碼實例: 設(shè)置 this.option({ width: 500, height: 500 }); |
widget() | jQuery | 返回一個包含原始元素或其他相關(guān)的生成元素的 jQuery 對象。
代碼實例: 當(dāng)創(chuàng)建小部件時,在小部件的原始元素周圍放置一個紅色的邊框。 _create: function() { this.widget().css( "border", "2px solid red" ); } |
事件 | 類型 | 描述 |
---|---|---|
create( event, ui ) | widgetcreate | 當(dāng)小部件被創(chuàng)建時觸發(fā)。
注意: 代碼實例: 初始化帶有指定 create 回調(diào)的小部件: $( ".selector" ).widget({ create: function( event, ui ) {} }); 綁定一個事件監(jiān)聽器到 widgetcreate 事件: $( ".selector" ).on( "widgetcreate", function( event, ui ) {} ); |
更多建議: