实用工具(Utilities) | 小部件(Widgets)
描述:使用与所有 jQuery UI 小部件相同的抽象化来创建有状态的 jQuery 插件。
参数 | 类型 | 类型 |
---|---|---|
name | String | 要创建的小部件名称,包括命名空间。 |
base | Function() | 要继承的基础小部件。必须是一个可以使用 `new` 关键词实例化的构造函数。默认为 jQuery.Widget。 |
prototype | PlainObject | 要作为小部件原型使用的对象。 |
您可以使用$.Widget对象作为要继承的基础,或者可以明确地从现有的 jQuery UI 或第三方控件,从头开始创建新的小部件。定义一个带有相同名称的小部件来继承基础部件,甚至允许您适当地扩展小部件。
jQuery UI 中包含许多保持状态的小部件,因此比典型的 jQuery 插件稍有不同的使用模式。所有的jQuery UI 小部件使用相同的模式,这是由部件库(Widget Factory)定义的。所以,只要您学会使用其中一个,您就知道如何使用其他的小部件(Widget)。
注释:本章节使用 进度条部件(Progressbar Widget) 演示实例,但是语法适用于每个小部件。
为了跟踪小部件的状态,我们必须引入小部件的全生命周期。小部件初始化时生命周期开始。要初始化一个小部件,我们只需要简单地在一个或多个元素上调用插件。
$( "#elem" ).progressbar();
这将初始化 jQuery 对象中的每个元素。上面实例中元素 id 为"elem"。
由于progressbar()调用时不带参数,小部件是使用默认选项进行初始化的。我们可以在初始化时传递一组选项来覆盖默认选项:
$( "#elem" ).progressbar({ value: 20 });
我们可以根据需要传递选项的个数,任何我们未传递的选项都使用它们的默认值。
您可以传递多个选项参数,这些参数将会被合并为一个对象(类似于 $.extend( true, target, object1, objectN ))。这在为所有实例覆盖一些设置,实例间共享选项时很有用:
var options = { modal: true, show: "slow" }; $( "#dialog1" ).dialog( options ); $( "#dialog2" ).dialog( options, { autoOpen: false });
所有在初始化时传递的选项都是深拷贝的,确保后续在不影响小部件的情况下修改对象。数组是唯一的例外,它们是按原样引用的。这个例外是为了适当地支持数据绑定,其中数据源必须作为引用。
默认值保存在小部件的属性中,因此我们可以覆盖 jQuery UI 设置的值。例如,在下面的设置后,所有将来的进度条实例将默认为值 80:
$.ui.progressbar.prototype.options.value = 80;
选项是小部件状态的组成部分,所以我们也可以在初始化后设置选项。我们会在后续看到 option 方法。
现在小部件已经初始化,我们可以查询它的状态,或者在小部件上执行动作。所有初始化后的动作都是以方法调用方式执行。为了在小部件上调用一个方法,我们向 jQuery 插件传递方法的名称。例如,在进度条部件(Progressbar Widget)上调用value()方法,我们可以使用:
$( "#elem" ).progressbar( "value" );
如果方法接受参数,我们可以在方法名称后传递参数。例如,要传递参数40到value()方法,我们可以使用:
$( "#elem" ).progressbar( "value", 40 );
就像 jQuery 中的其他方法,大多数的小部件方法返回 jQuery 对象:
$( "#elem" ) .progressbar( "value", 90 ) .addClass( "almost-done" );
每个小部件都有自己的方法设置,这些设置是基于小部件提供的功能。但是,有一些方法是存在于所有的小部件上,这会在下面进行详细讲解。
所有的小部件都有与它们各种行为相关的事件,以便在状态改变的时候通知您。对于大多数的小部件,当事件被触发时,名称以小部件名称的小写字母形式作为前缀。例如,我们可以绑定进度条的change事件,该事件在值改变时触发。
$( "#elem" ).bind( "progressbarchange", function() { alert( "The value has changed!" ); });
每个事件都有一个对应的回调,这会作为选项。如果需要,我们可以抓住进度条的change回调,而不用绑定progressbarchange事件。
$( "#elem" ).progressbar({ change: function() { alert( "The value has changed!" ); } });
所有的小部件都有一个change事件,该事件在实例化时触发。
小部件的实例是使用带有小部件全称作为键的 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‘ )" );
所有的小部件都有下面的属性:
描述:部件库(Widget Factory)使用的基础小部件。
选项 | 方法 | 事件 |
---|---|---|
disabled
hide
show
|
_create
_delay
_destroy
_focusable
_getCreateEventData
_getCreateOptions
_hide
_hoverable
_init
_off
_on
_setOption
_setOptions
_show
_super
_superApply
_trigger
destroy
disable
enable
option
widget
|
create
|
选项 | 类型 | 描述 | 默认值 |
---|---|---|---|
disabled | Boolean |
如果设置为true,则禁用该小部件。 代码实例: 初始化带有指定disabled选项的小部件: $( ".selector" ).widget({ disabled: true }); 在初始化后,获取或设置disabled选项: // getter var disabled = $( ".selector" ).widget( "option", "disabled" ); // setter $( ".selector" ).widget( "option", "disabled", true ); |
false |
hide | Boolean 或 Number 或 String 或 Object |
是否使用动画隐藏元素,以及如何动画隐藏元素。 支持多个类型:
代码实例: 初始化带有指定hide选项的小部件: $( ".selector" ).widget({ hide: { effect: "explode", duration: 1000 } }); 在初始化后,获取或设置hide选项: // getter var hide = $( ".selector" ).widget( "option", "hide" ); // setter $( ".selector" ).widget( "option", "hide", { effect: "explode", duration: 1000 } ); |
null |
show | Boolean 或 Number 或 String 或 Object |
是否使用动画显示元素,以及如何动画显示元素。 支持多个类型:
代码实例: 初始化带有指定show选项的小部件: $( ".selector" ).widget({ show: { effect: "blind", duration: 800 } }); 在初始化后,获取或设置show选项: // getter var show = $( ".selector" ).widget( "option", "show" ); // setter $( ".selector" ).widget( "option", "show", { effect: "blind", duration: 800 } ); |
null |
方法 | 返回 | 描述 |
---|---|---|
_create() | jQuery (plugin only) |
_create()方法是小部件的构造函数。没有参数,但是this.element和this.options已经设置。
代码实例: 基于一个选项设置小部件元素的背景颜色。 _create: function() { this.element.css( "background-color", this.options.color ); } |
_delay( fn [, delay ] ) | Number |
在指定延迟后调用提供的函数。保持this上下文正确。本质上是setTimeout()。 使用clearTimeout()返回超时 ID。
代码实例: 100 毫秒后在小部件上调用_foo()方法。 this._delay( this._foo, 100 ); |
_destroy() | jQuery (plugin only) |
公共的 destroy() 方法清除所有的公共数据、事件等等。代表了定制、指定小部件、清理的_destroy()。
代码实例: 当小部件被销毁时,从小部件的元素移除一个 class。 _destroy: function() { this.element.removeClass( "my-widget" ); } |
_focusable( element ) | jQuery (plugin only) |
建立聚焦在元素上时要应用ui-state-focusclass 的element。
代码实例: 向小部件内的一组元素应用 focusable 样式: this._focusable( this.element.find( ".my-items" ) ); |
_getCreateEventData() | Object |
所有的小部件触发 create 事件。默认情况下,事件中不提供任何的数据,但是该方法会返回一个对象,作为create事件的数据被传递。
代码实例: 向create事件处理程序传递小部件的选项,作为参数。 _getCreateEventData: function() { return this.options; } |
_getCreateOptions() | Object |
该方法允许小部件在初始化期间为定义选项定义一个自定义的方法。用户提供的选项会覆盖该方法返回的选项,即会覆盖默认的选项。
代码实例: 让小部件元素的 id 属性作为选项可用。 _getCreateOptions: function() { return { id: this.element.attr( "id" ) }; } |
_hide( element, option [, callback ] ) | jQuery (plugin only) |
使用内置的动画方法或使用自定义的特效隐藏一个元素。如需了解可能的option值,请查看 hide。
代码实例: 为自定义动画传递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) |
建立悬浮在元素上时要应用ui-state-hoverclass 的element。事件处理程序在销毁时自动清理。
代码实例: 当悬浮在元素上时,向元素内所有的div应用 hoverable 样式。 this._hoverable( this.element.find( "div" ) ); |
_init() | jQuery (plugin only) |
小部件初始化的理念与创建不同。任何时候不带参数的调用插件或者只带一个选项哈希的调用插件,初始化小部件。当小部件被创建时会包含这个方法。
注释:如果存在不带参数成功调用小部件时要执行的逻辑动作,初始化只能在这时处理。
代码实例: 如果设置了autoOpen选项,则调用open()方法。 _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) |
授权通过事件名称内的选择器被支持,例如"click .foo"。_on()方法提供了一些直接事件绑定的好处:
代码实例: 放置小部件元素内所有被点击的链接的默认行为。 this._on( this.element, { "click a": function( event ) { event.preventDefault(); } }); |
_setOption( key, value ) | jQuery (plugin only) |
为每个独立的选项调用 _setOptions() 方法。小部件状态随着改变而更新。
代码实例: 当小部件的height或width选项改变时,更新小部件的元素。 _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) |
当调用 option() 方法时调用,无论以什么形式调用option()。如果您要根据多个选项的改变而改变处理器密集型,重载该方法是很有用的。
代码实例: 如果小部件的height或width选项改变,调用resize方法。 _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) |
使用内置的动画方法或使用自定义的特效显示一个元素。如需了解可能的option值,请查看 show。
代码实例: 为自定义动画传递show选项。 this._show( this.element, this.options.show, function() { // Focus the element when it‘s fully visible. this.focus(); } |
_super( [arg ] [, ... ] ) | jQuery (plugin only) |
从父部件中调用相同名称的方法,带有任意指定的参数。本质上是.call()。
代码实例: 处理title选项更新,并调用付部件的_setOption()来更新选项的内部存储。 _setOption: function( key, value ) { if ( key === "title" ) { this.element.find( "h3" ).text( value ); } this._super( key, value ); } |
_superApply( arguments ) | jQuery (plugin only) |
从父部件中调用相同名称的方法,带有参数的数组。本质上是.apply()。
代码实例: 处理title选项更新,并调用付部件的_setOption()来更新选项的内部存储。 _setOption: function( key, value ) { if ( key === "title" ) { this.element.find( "h3" ).text( value ); } this._superApply( arguments ); } |
_trigger( type [, event ] [, data ] ) | Boolean |
触发一个事件及其相关的回调。带有该名称的选项与作为回调被调用的类型相等。 事件名称是小部件名称和类型的小写字母串。 注释:当提供数据时,您必须提供所有三个参数。如果没有传递事件,则传递null。 如果默认行为是阻止的,则返回false,否则返回true。当处理程序返回false时或调用event.preventDefault()时,则阻止默认行为发生。
代码实例: 当按下一个键时,触发search事件。 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) |
完全移除小部件功能。这会把元素返回到它的预初始化状态。
代码实例: 当点击小部件的任意锚点时销毁小部件。 this._on( this.element, { "click a": function( event ) { event.preventDefault(); this.destroy(); } }); |
disable() | jQuery (plugin only) |
禁用小部件。
代码实例: 当点击小部件的任意锚点时禁用小部件。 this._on( this.element, { "click a": function( event ) { event.preventDefault(); this.disable(); } }); |
enable() | jQuery (plugin only) |
启用小部件。
代码实例: 当点击小部件的任意锚点时启用小部件。 this._on( this.element, { "click a": function( event ) { event.preventDefault(); this.enable(); } }); |
option( optionName ) | Object |
获取当前与指定的optionName关联的值。
代码实例: 获得width选项的值。 this.option( "width" ); |
option() | PlainObject |
获取一个包含键/值对的对象,键/值对表示当前小部件选项哈希。
代码实例: 记录每个小部件选项的键/值对,用于调试。 var options = this.option(); for ( var key in options ) { console.log( key, options[ key ] ); } |
option( optionName, value ) | jQuery (plugin only) |
设置与指定的optionName关联的小部件选项的值。
代码实例: 设置width选项为500。 this.option( "width", 500 ); |
option( options ) | jQuery (plugin only) |
为小部件设置一个或多个选项。
代码实例: 设置height和width选项为500。 this.option({ width: 500, height: 500 }); |
widget() | jQuery |
返回一个包含原始元素或其他相关的生成元素的jQuery对象。
代码实例: 当创建小部件时,在小部件的原始元素周围放置一个红色的边框。 _create: function() { this.widget().css( "border", "2px solid red" ); } |
事件 | 类型 | 描述 |
---|---|---|
create( event, ui ) | widgetcreate |
当小部件被创建时触发。
注意:ui对象是空的,这里包含它是为了与其他事件保持一致性。 代码实例: 初始化带有指定 create 回调的小部件: $( ".selector" ).widget({ create: function( event, ui ) {} }); 绑定一个事件监听器到 widgetcreate 事件: $( ".selector" ).on( "widgetcreate", function( event, ui ) {} ); |