news 2026/3/12 17:06:57

jQuery UI 通过部件库(Widget Factory)扩展小部件

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
jQuery UI 通过部件库(Widget Factory)扩展小部件

jQuery UI 通过 Widget Factory 扩展小部件

Widget Factory$.widget)提供了强大的继承机制,让开发者可以轻松扩展现有 jQuery UI 小部件,或基于一个部件创建全新的变体。这正是 jQuery UI 官方许多小部件(如 Menu 是 Button 的扩展,Autocomplete 是 Menu 的扩展)实现方式的核心。

扩展基本语法
$.widget("custom.newWidgetName",$.existingNamespace.existingWidget,{// 新选项、方法、重写父类方法});
  • custom.newWidgetName:新部件的全名(命名空间 + 部件名)。
  • $.existingNamespace.existingWidget:要继承的父部件(例如$.ui.dialog)。
  • 第三个对象:定义新选项、重写父类方法、添加新方法。

关键方法:

  • this._super():调用父类同名方法。
  • this._superApply(arguments):带参数调用父类方法。
示例 1:简单扩展 Dialog(添加标题图标和自定义按钮)
$.widget("custom.iconDialog",$.ui.dialog,{// 新增默认选项options:{iconClass:"ui-icon-info",// 默认信息图标extraButton:null// 额外按钮配置 { text: "帮助", click: function }},// 重写 _create 方法,在标题栏添加图标_create:function(){// 先调用父类的 _createthis._super();// 在标题栏前添加图标if(this.options.iconClass){varicon=$("<span>").addClass("ui-dialog-title-icon "+this.options.iconClass).prependTo(this.uiDialogTitlebar);}// 添加额外按钮if(this.options.extraButton){varbuttons=this.options.buttons||{};buttons[this.options.extraButton.text]=this.options.extraButton.click;this.options.buttons=buttons;this._setOption("buttons",buttons);// 触发按钮更新}},// 可选:重写 open 方法,打开时添加动画效果open:function(){this._super();// 调用父类 openthis.element.effect("bounce",{times:3},300);// 额外弹跳效果}});

使用方式

<divid="myDialog"title="重要提示">这是一个带图标的对话框。</div><script>$(function(){$("#myDialog").customIconDialog({iconClass:"ui-icon-alert",modal:true,extraButton:{text:"帮助",click:function(){alert("帮助内容");}}});// 打开对话框$("#myDialog").customIconDialog("open");});</script>
示例 2:扩展 Tabs(添加“关闭”按钮到每个标签)
$.widget("custom.closableTabs",$.ui.tabs,{options:{closable:true},_create:function(){this._super();if(this.options.closable){this._addCloseButtons();}},// 在每个标签后添加关闭图标_addCloseButtons:function(){this.tablist.find("li").each(function(){var$tab=$(this);if(!$tab.find(".ui-tabs-close").length){$("<span>").addClass("ui-tabs-close ui-icon ui-icon-close").appendTo($tab).on("click",function(e){e.stopPropagation();varpanelId=$tab.find("a").attr("href");varindex=$("li",$tab.parent()).index($tab);$tab.closest(".ui-tabs").customClosableTabs("remove",index);});}});},// 重写 refresh 方法,确保新添加的标签也有关闭按钮refresh:function(){this._super();this._addCloseButtons();},// 可选:自定义 remove 方法,触发关闭事件remove:function(index){varpanelId=this.tabs.eq(index).attr("aria-controls");vareventData={panel:this.panels.eq(index)};if(this._trigger("beforeClose",null,eventData)===false){return;}this._super(index);this._trigger("close",null,eventData);}});

使用方式

<divid="tabs"><ul><li><ahref="#tab1">标签1</a></li><li><ahref="#tab2">标签2</a></li></ul><divid="tab1">内容1</div><divid="tab2">内容2</div></div><script>$("#tabs").customClosableTabs({closable:true,beforeClose:function(event,ui){returnconfirm("确定关闭此标签页?");}});</script>
示例 3:基于 Button 创建带加载状态的按钮
$.widget("custom.loadingButton",$.ui.button,{options:{loadingText:"加载中..."},// 添加 loading 方法loading:function(state){if(state){this.originalText=this.element.text();this.element.text(this.options.loadingText);this.options.disabled=true;this._super("option","disabled",true);}else{if(this.originalText){this.element.text(this.originalText);}this.options.disabled=false;this._super("option","disabled",false);}}});
总结优势
  • 代码复用:继承父部件的大部分功能,只修改需要的部分。
  • 保持兼容:新部件仍支持所有父部件的选项、方法、事件。
  • 一致性:自动继承 CSS 类、主题支持、状态管理等。
  • 链式继承:可以多层继承(如 A → B → C)。

通过 Widget Factory 的继承机制,你可以轻松创建功能更丰富、符合项目需求的自定义小部件,同时保持 jQuery UI 的统一风格和行为。

如果您有具体需求(如扩展 Datepicker 添加节假日高亮,或扩展 Autocomplete 支持异步加载),告诉我,我可以提供完整代码示例!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/11 16:24:43

用JS Proxy快速构建API Mock系统原型

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个基于JS Proxy的API Mock系统&#xff0c;功能包括&#xff1a;1. 动态生成RESTful API端点 2. 支持CRUD操作 3. 可配置的延迟响应 4. 随机数据生成 5. 请求日志记录。要求代…

作者头像 李华
网站建设 2026/3/9 6:48:28

bigpicture.js终极指南:打造无限缩放的大图浏览体验

bigpicture.js终极指南&#xff1a;打造无限缩放的大图浏览体验 【免费下载链接】bigpicture.js bigpicture.js is a Javascript library that allows infinite panning and infinite zooming in HTML pages. 项目地址: https://gitcode.com/gh_mirrors/bi/bigpicture.js …

作者头像 李华
网站建设 2026/3/5 9:51:54

PyTorch新手必学:5分钟掌握unsqueeze的用法

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 生成一个面向初学者的unsqueeze教学代码&#xff0c;要求&#xff1a;1)使用简单易懂的示例 2)包含张量操作前后的可视化对比 3)分步骤解释 4)提供常见错误示例及解决方法 5)使用De…

作者头像 李华
网站建设 2026/3/9 3:52:21

MudBlazor数据表格筛选:从入门到精通的完整解决方案

MudBlazor数据表格筛选&#xff1a;从入门到精通的完整解决方案 【免费下载链接】MudBlazor Blazor Component Library based on Material design with an emphasis on ease of use. Mainly written in C# with Javascript kept to a bare minimum it empowers .NET developers…

作者头像 李华
网站建设 2026/3/9 16:19:16

Kotaemon社区版发布:免费获取基础功能模块

Kotaemon社区版发布&#xff1a;免费获取基础功能模块等等——先别急着划走。如果你点进来是想看某个硬件项目的电路拓扑、电源管理芯片选型&#xff0c;或者IS时序调试经验&#xff0c;那确实跑偏了。但换个角度想&#xff1a;当我们的嵌入式设备越来越“聪明”&#xff0c;开…

作者头像 李华
网站建设 2026/3/12 6:38:18

UI-TARS交互精度优化的技术探秘:从像素偏差到微米级定位

UI-TARS交互精度优化的技术探秘&#xff1a;从像素偏差到微米级定位 【免费下载链接】UI-TARS 项目地址: https://gitcode.com/GitHub_Trending/ui/UI-TARS 在智能UI交互领域&#xff0c;坐标定位的准确性犹如外科手术中的手术刀&#xff0c;差之毫厘便会影响整个操作的…

作者头像 李华