Extending Widgets with the Widget Factory
https://learn.jquery.com/jquery-ui/widget-factory/extending-widgets/
实例
https://github.com/tkvw/jQuery-File-Upload/blob/master/js/jquery.fileupload-image-editor.js
扩展了
https://github.com/blueimp/jQuery-File-Upload/blob/master/js/jquery.fileupload.js
jQuery UI's widget factory makes it easy to build widgets that extend the functionality of existing widgets.
Doing so allows you to build powerful widgets on top of an existing base, as well as make small tweaks to an existing widget's functionality.
Note: This article assumes some basic knowledge of what the widget factory is and how it works. If you're unfamiliar with this, read up on how to use the widget factory first.
link Creating Widget Extensions
如何创建widget
Creating widgets with the widget factory is done by passing the name of the widget and a prototype object to $.widget()
.
The following creates a "superDialog" widget in the "custom" namespace.
- $.widget( "custom.superDialog", {} );
To allow for extension, $.widget()
optionally accepts the constructor of a widget to use as a parent.
When specifying a parent widget, pass it as the second argument - after the widget's name, and before the widget's prototype object.
Like the previous example, the following also creates a "superDialog" widget in the "custom" namespace.
However, this time the constructor of jQuery UI's dialog widget ($.ui.dialog
) is passed, indicating that the superDialog widget should use jQuery UI's dialog widget as a parent.
- $.widget( "custom.superDialog", $.ui.dialog, {} );
Here superDialog and dialog are essentially equivalent widgets with different names and namespaces. To make our new widget more interesting we can add methods to its prototype object.
以jQuery file upload举例,
- $.widget('blueimp.fileupload', {
扩展【使用的是下面的Redefining Widgets,不需要创建新的widget】
- $.widget('blueimp.fileupload', $.blueimp.fileupload, {
A widget's prototype object is the final argument passed to $.widget()
.
So far, our examples have been using an empty object. Let's add a method to this object:
- $.widget( "custom.superDialog", $.ui.dialog, {
- red: function() {
- this.element.css( "color", "red" );
- }
- });
- // Create a new <div>, convert it into a superDialog, and call the red() method.
- $( "<div>I am red</div>" )
- .superDialog()
- .superDialog( "red" );
Now the superDialog
has a red()
method that will change the color of its text to red.
Note how the widget factory automatically sets this
to the widget's instance object.
For a full list of the methods and properties available on the instance, see the widget factory's API documentation.
Extending Existing Methods
Sometimes you need to tweak or add to the behavior of existing widget methods.
The do this, specify a method with the same name as the method you want to override on the prototype object.
The following example overrides dialog's open()
method. Since dialogs automatically open by default, "open"
will be logged when this code runs.
- $.widget( "custom.superDialog", $.ui.dialog, {
- open: function() {
- console.log( "open" );
- }
- });
- // Create a new <div>, and convert it into a superDialog.
- $( "<div>" ).superDialog();
直接添加重名方法,会导致之前父widget的方法被屏蔽,通过_super和_superApply来使得父widget的方法可用
While this runs, there's a problem. Since we overrode the default behavior of open()
, the dialog no longer displays on the screen.
When we place methods on the prototype object, we are not actually overriding the original method - rather, we are placing a new method at a higher level in the prototype chain.
To make the parent's methods available, the widget factory provides two methods - _super()
and _superApply()
.
举例https://github.com/ChuckForkJS/jQuery-File-Upload/blob/master/js/jquery.fileupload-image-editor.js#L144 这个是子widget
https://github.com/ChuckForkJS/jQuery-File-Upload/blob/master/js/jquery.fileupload.js#L1288 这个是父widget
Using _super()
and _superApply()
to Access Parents
_super()
and _superApply()
invoke methods of the same name in the parent widget.
Refer to the following example. Like the previous one, this example also overrides the open()
method to log "open"
.
However, this time _super()
is run to invoke dialog's open()
and open the dialog.
- $.widget( "custom.superDialog", $.ui.dialog, {
- open: function() {
- console.log( "open" );
- // Invoke the parent widget's open().
- return this._super();
- }
- });
- $( "<div>" ).superDialog();
_super()
and _superApply()
were designed to behave like the native Function.prototype.call()
and Function.prototype.apply()
methods.
Therefore, _super()
accepts an argument list, and _superApply()
accepts a single array of arguments.
区别只是参数问题,一个是参数列表,另外一个是参数数组
This difference is shown in the example below.
- $.widget( "custom.superDialog", $.ui.dialog, {
- _setOption: function( key, value ) {
- // Both invoke dialog's setOption() method. _super() requires the arguments
- // be passed as an argument list, _superApply() as a single array.
- this._super( key, value );
- this._superApply( arguments );
- }
- });
Redefining Widgets
jQuery UI 1.9 added the ability for widgets to redefine themselves.
Therefore, instead of creating a new widget, we can pass $.widget()
an existing widget's name and constructor.
The following example adds the same logging in open()
, but doesn't create a new widget to do so.
- $.widget( "ui.dialog", $.ui.dialog, {
- open: function() {
- console.log( "open" );
- return this._super();
- }
- });
- $( "<div>" ).dialog();
With this approach you can extend an existing widget's method and still have access to the original methods using _super()
- all without creating a new widget.
Widgets and Polymorphism 多态
One word of warning when interacting with widget extensions and their plugins.
The parent widget's plugin cannot be used to invoke methods on elements that are child widgets.
This is shown in the example below.
- $.widget( "custom.superDialog", $.ui.dialog, {} );
- var dialog = $( "<div>" ).superDialog();
- // This works.
- dialog.superDialog( "close" );
- // This doesn't.
- dialog.dialog( "close" );
Above, the parent widget's plugin, dialog()
, cannot invoke the close()
method on an element that is a superDialog.
For more on the invoking widget methods see Widget Method Invocation.
Customizing Individual Instances
All the examples we have looked at so far have extended methods on the widget's prototype.
Methods overridden on the prototype affect all instances of the widget.
To show this, refer to the example below; both instances of the dialog use the same open()
method.
- $.widget( "ui.dialog", $.ui.dialog, {
- open: function() {
- console.log( "open" );
- return this._super();
- }
- });
- // Create two dialogs, both use the same open(), therefore "open" is logged twice.
- $( "<div>" ).dialog();
- $( "<div>" ).dialog();
While this is powerful, sometimes you only need to change the behavior for a single instance of the widget.
To do this, obtain a reference to the instance and override the method using normal JavaScript property assignment.
The example below shows this.
- var dialogInstance = $( "<div>" )
- .dialog()
- // Retrieve the dialog's instance and store it.
- .data( "ui-dialog" );
- // Override the close() method for this dialog
- dialogInstance.close = function() {
- console.log( "close" );
- };
- // Create a second dialog
- $( "<div>" ).dialog();
- // Select both dialogs and call close() on each of them.
- // "close" will only be logged once.
- $( ":data(ui-dialog)" ).dialog( "close" );
This technique of overriding methods for individual instances is perfect for one-off customizations.
Extending Widgets with the Widget Factory的更多相关文章
- How To Use the Widget Factory 使用widget factory创建插件
To start, we'll create a progress bar that just lets us set the progress once. 创建一个基于widget factory ...
- jQuery UI Widget Factory
https://learn.jquery.com/jquery-ui/widget-factory/ The jQuery UI Widget Factory is an extensible bas ...
- POJ 2947 Widget Factory(高斯消元)
Description The widget factory produces several different kinds of widgets. Each widget is carefully ...
- Widget Factory (高斯消元解线性方程组)
The widget factory produces several different kinds of widgets. Each widget is carefully built by a ...
- 通过扩展jQuery UI Widget Factory实现手动调整Accordion高度
□ 实现Accordion高度一致 <head> <meta name="viewport" content="width=device-width&q ...
- 【POJ】2947 Widget Factory(高斯消元)
http://poj.org/problem?id=2947 各种逗啊..还好1a了.. 题意我就不说了,百度一大把. 转换为mod的方程组,即 (x[1,1]*a[1])+(x[1,2]*a[2]) ...
- POJ Widget Factory 【求解模线性方程】
传送门:http://poj.org/problem?id=2947 Widget Factory Time Limit: 7000MS Memory Limit: 65536K Total Su ...
- Why Use the Widget Factory?
https://learn.jquery.com/jquery-ui/widget-factory/why-use-the-widget-factory/ Writing jQuery plugins ...
- POJ 2947:Widget Factory 求同余方程
Widget Factory Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 5173 Accepted: 1790 De ...
随机推荐
- spring boot 整合activemq
1 Spring Boot与ActiveMQ整合 1.1使用内嵌服务 (1)在pom.xml中引入ActiveMQ起步依赖 <properties> <spring.version& ...
- 六、JVM — JDK 监控和故障处理工具
JDK 监控和故障处理工具总结 JDK 命令行工具 jps:查看所有 Java 进程 jstat: 监视虚拟机各种运行状态信息 jinfo: 实时地查看和调整虚拟机各项参数 jmap:生成堆转储快照 ...
- tcp和udp详解??
TCP:面向连接的可靠传输 tcp规定了:传输服务必须建立连接 传输结束必须断开连接 传输数据必须保证可靠 数据的可靠性:无重复.无丢失.无失序.无差错. 建立连接(三次握手): ...
- Dungeon Master (三维bfs)
You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of un ...
- QRCode.js一个生成二维码的javascript库
前言 最近在开发中遇到一个需求:将后端返回的链接转换成二维码,那么如何来实现呢?我们可以使用QRCode.js来解决这一问题 什么是 QRCode.js? QRCode.js 是一个用于生成二维码的 ...
- Math、Date内置对象方法整理
Math : 内置的对象(构造函数)静态属性或静态方法. 一. Math.PI : 圆周率 ...
- 生成EXCEL文件是经常需要用到的功能,我们利用一些开源库可以很容易实现这个功能。
方法一:利用excellibrary,http://code.google.com/p/excellibrary/ excellibrary是国人写的开源组件,很容易使用,可惜貌似还不支持.xlsx( ...
- AtCoder Regular Contest 066 E - Addition and Subtraction Hard (结论+DP)
Time limit : 2sec / Memory limit : 256MB Score : 900 points Problem Statement Joisino has a formula ...
- YNOI2016:掉进兔子洞 (莫队+bitset)
YNOI2016:掉进兔子洞 题意简述: 有 m 个询问,每次询问三个区间,把三个区间中同时出现的数一个一个删掉,问最后三个区间剩下的数的个数和,询问独立. 注意这里删掉指的是一个一个删,不是把等于这 ...
- Scrat
前端工程化集成:Scrat UC团队在百度FIS基础上二次开发的模块化开发框架,可以与vue配合使用