JqueryUI - 部件工厂


早些时候,在 jQuery 中编写自定义控件的唯一方法是扩展$.fn命名空间。这对于简单的小部件来说效果很好。假设您构建更多有状态的小部件,它很快就会变得很麻烦。为了帮助构建小部件的过程,在 jQuery UI 中引入了小部件工厂,它删除了通常与管理小部件相关的大部分样板文件。

jQueryUI Widget Factory 只是一个函数 ($.widget),它接受字符串名称和对象作为参数,并创建 jQuery 插件和“类”来封装其功能。

句法

以下是 jQueryUI Widget Factory 方法的语法 -

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 禁用隐藏

如果设置为true,此选项将禁用小部件。默认情况下它的值为false

选项 - 禁用隐藏

如果设置为true,此选项将禁用小部件。默认情况下它的值为false

例子

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

此选项确定如何为元素的隐藏设置动画。默认情况下它的值为null

选项-隐藏

此选项确定如何为元素的隐藏设置动画。默认情况下它的值为null

这可以是类型 -

  • Boolean - 如果设置为false则不会使用动画。如果设置为true,元素将以默认持续时间和默认缓动淡出。

  • Number - 元素将以指定的持续时间和默认的缓动淡出。

  • String - 该元素将使用指定的效果隐藏。

  • 对象- 如果该值是一个对象,则可以提供效果、延迟、持续时间和缓动属性。

例子

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

此选项确定如何对元素的显示进行动画处理。默认情况下它的值为null

选项 - 显示

此选项确定如何对元素的显示进行动画处理。默认情况下它的值为null

这可以是类型 -

  • Boolean - 如果设置为false,则不会使用动画来显示元素。如果设置为true,元素将以默认持续时间和默认缓动淡入。

  • Number - 元素将以指定的持续时间和默认的缓动淡入。

  • String - 将使用指定的效果显示元素。

  • 对象- 如果该值是一个对象,则可以提供效果、延迟、持续时间和缓动属性。

例子

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

方法

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

先生。 动作与描述
1 _创造()

该方法是小部件的构造函数。没有参数,但this.elementthis.options已经设置。

动作 - _create()

此操作完全破坏了元素的手风琴功能。元素返回到其初始化前的状态。该方法是小部件的构造函数。没有参数,但this.elementthis.options已经设置。

例子

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

此方法在指定的延迟后调用提供的函数。返回与clearTimeout()一起使用的超时ID 。

动作 - _delay( fn [, 延迟 ] )

This method invokes the provided function after a specified delay. Returns the timeout ID for use with clearTimeout().

Example

this._delay( this._foo, 100 );
3 _破坏()

公共destroy()方法清理所有常见数据、事件等,然后委托给此_destroy()方法进行自定义、特定于小部件的清理。

Action - _destroy()

The public destroy() method cleans up all common data, events, etc. and then delegates out to this _destroy() method for custom, widget-specific, cleanup.

Example

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

此方法设置元素以在焦点上应用ui-state-focus类。事件处理程序在销毁时会自动清理。

Action - _focusable( element )

This method sets up element to apply the ui-state-focus class on focus. The event handlers are automatically cleaned up on destroy.

Example

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

所有小部件都会触发创建事件。默认情况下,事件中不提供任何数据,但此方法可以返回一个对象,该对象将作为创建事件的数据传递。

Action - _getCreateEventData()

All widgets trigger the create event. By default, no data is provided in the event, but this method can return an object which will be passed as the create event's data.

Example

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

此方法允许小部件定义用于在实例化期间定义选项的自定义方法。用户提供的选项会覆盖此方法返回的选项,从而覆盖默认选项。

Action - _getCreateOptions()

This method allows the widget to define a custom method for defining options during instantiation. The user-provided options override the options returned by this method, which override the default options.

Example

_getCreateOptions: function() {
   return { id: this.element.attr( "id" ) };
}
7 _hide( 元素, 选项 [, 回调 ] )

此方法使用内置动画方法或使用自定义效果立即隐藏元素。请参阅隐藏选项以了解可能的选项值。

Action - _hide( element, option [, callback ] )

This method hides an element immediately, using built-in animation methods, or using custom effects. See the hide option for possible option values.

Example

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

此方法设置元素在悬停时应用 ui-state-hover 类。事件处理程序在销毁时会自动清理。

Action - _hoverable( element )

This method Sets up element to apply the ui-state-hover class on hover. The event handlers are automatically cleaned up on destroy.

Example

this._hoverable( this.element.find( "div" ) );
9 _在里面()

任何时候不带参数或仅使用选项哈希调用插件时,都会初始化小部件;这包括创建小部件的时间。

Action - _init()

Any time the plugin is called with no arguments or with only an option hash, the widget is initialized; this includes when the widget is created.

Example

_init: function() {
   if ( this.options.autoOpen ) {
      this.open();
   }
}
10 _off( 元素, 事件名称 )

此方法解除事件处理程序与指定元素的绑定。

Action - _off( element, eventName )

This method unbinds event handlers from the specified element(s).

Example

this._off( this.element, "click" );
11 _on( [suppressDisabledCheck ] [, 元素 ], 处理程序 )

将事件处理程序绑定到指定的元素。通过事件名称中的选择器支持委派,例如“click .foo”。

Action - _on( [suppressDisabledCheck ] [, element ], handlers )

Binds event handlers to the specified element(s). Delegation is supported via selectors inside the event names, e.g., "click .foo".

Example

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

对于每个单独的选项,从_setOptions()方法调用此方法。小部件状态应根据更改进行更新。

Action - _setOption( key, value )

This method is called from the _setOptions() method for each individual option. Widget state should be updated based on changes.

Example

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

每当调用 option() 方法时都会调用此方法,无论调用 option() 方法的形式如何。

Action - _setOptions( options )

This method is called whenever the option() method is called, regardless of the form in which the option() method was called.

Example

_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( 元素, 选项 [, 回调 ] )

使用内置动画方法或使用自定义效果立即显示元素。请参阅显示选项以了解可能的选项值。

Action - _show( element, option [, callback ] )

Shows an element immediately, using built-in animation methods, or using custom effects. See the show option for possible option values.

Example

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

此方法使用任何指定的参数从父窗口小部件调用同名的方法。本质上是.call()。

Action - _super( [arg ] [, ... ] )

This method invokes the method of the same name from the parent widget, with any specified arguments. Essentially .call().

Example

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

使用参数数组从父窗口小部件调用同名的方法。

Action - _superApply( arguments )

Invokes the method of the same name from the parent widget, with the array of arguments.

Example

_setOption: function( key, value ) {
   if ( key === "title" ) {
      this.element.find( "h3" ).text( value );
   }
   this._superApply( arguments );
}
17 号 _trigger( 类型 [, 事件 ] [, 数据 ] )

此方法触发事件及其关联的回调。名称等于 type 的选项将作为回调被调用。

Action - _trigger( type [, event ] [, data ] )

This method triggers an event and its associated callback. The option with the name equal to type is invoked as the callback.

Example

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 破坏()

此方法完全删除了小部件功能。这将使元素返回到其预初始化状态。

Action - destroy()

This method removes the widget functionality completely. This will return the element back to its pre-init state.

Example

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

此方法禁用该小部件。

Action - disable()

This method disables the widget.

Example

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

此方法启用小部件。

Action - enable()

This method enables the widget.

Example

this._on( this.element, {
   "click a": function( event ) {
      event.preventDefault();
      this.enable();
   }
});
21 选项(选项名称)

此方法获取当前与指定optionName关联的值。

Action - option( optionName )

This method gets the value currently associated with the specified optionName.

Example

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

此方法获取一个对象,其中包含表示当前小部件选项哈希的键/值对。

Action - option()

This method gets an object containing key/value pairs representing the current widget options hash.

Example

var options = this.option();
for ( var key in options ) {
   console.log( key, options[ key ] );
}
23 选项(选项名称,值)

此方法设置与指定 optionName 关联的小部件选项的值。

Action - option( optionName, value )

This method sets the value of the widget option associated with the specified optionName.

Example

this.option( "width", 500 );
24 选项(选项)

此方法为小部件设置一个或多个选项。

Action - option( options )

This method sets one or more options for the widget.

Example

this.option({
   width: 500,
   height: 500
});
25 小部件()

此方法返回一个包含原始元素或其他相关生成元素的 jQuery 对象。

Action - widget()

This method returns a jQuery object containing the original element or other relevant generated element.

Example

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

活动

先生。 活动方式及说明
1 创建(事件,用户界面)

创建小部件时会触发此事件。

Event - create( event, ui )

This event is triggered when a widget is created. Where event is of type Event, and ui is of type Object.

Syntax

$( ".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函数就是用于此目的。用户设置的每个单独选项都会调用它。这里我们设置按钮的宽度背景颜色。

<!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 时,我们将触发一个事件。您所要做的就是添加到移动功能 -

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

在这种情况下,事件称为出站,并且空事件对象与自定义事件对象一起传递,该对象仅提供位置作为其唯一属性。

整个移动函数是 -

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 的标准浏览器中打开它,将打开一个警告框。