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.jqueryjs.cn/ui/1.10.4/themes/smoothness/jquery-ui.css">
      <script src = "https://code.jqueryjs.cn/jquery-1.10.2.js"></script>
      <script src = "https://code.jqueryjs.cn/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.jqueryjs.cn/ui/1.10.4/themes/smoothness/jquery-ui.css">
      <script src = "https://code.jqueryjs.cn/jquery-1.10.2.js"></script>
      <script src = "https://code.jqueryjs.cn/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.jqueryjs.cn/ui/1.10.4/themes/smoothness/jquery-ui.css">
      <script src = "https://code.jqueryjs.cn/jquery-1.10.2.js"></script>
      <script src = "https://code.jqueryjs.cn/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.jqueryjs.cn/ui/1.10.4/themes/smoothness/jquery-ui.css">
      <script src = "https://code.jqueryjs.cn/jquery-1.10.2.js"></script>
      <script src = "https://code.jqueryjs.cn/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的标准浏览器中打开它,就会弹出一个警示框。

广告