Jquery插件开发Ⅱ

来源:互联网 发布:仓管员工作软件 编辑:程序博客网 时间:2024/06/05 20:14

本篇介绍第三种也是最后一种Jquery插件开发的方式:$.widget() 应用jQuery UI的部件工厂方式

3. $.widget() 应用jQuery UI的部件工厂方式

使用jQueryUI的widget来写插件,相比于基本的jquery插件有一些好处:

* 方便实现继承,代码重用

* 默认是单例

* widget已经给你实现好的一些常用方法,例如destroy

但是也会有一些容易引发的问题规范需要我们注意,下面我们先介绍如何使用这种方式编写插件,随后再补充需要注意的内容。

Jquery ui css framework

Jquery ui css frameworkjquery ui中的一个样式框架,可以利用jquery Theme roller 来生成自己想要的css样式效果,也可以用来渲染我们使用widget编写的。我们可以利用jquery ui的一些框架来开发出基于jquery ui css framework效果的插件来。

Jquery ui中两大核心的css文件是ui.core.cssui.theme.css.这两个css样式贯穿整个基于jquery ui的界面上,并且可以通过jquery ui ThemeRoller来生成自己的样式。

.ui-helper-hidden :为元素应用display:none

.ui-helper-hidden-accessible:将元素的绝对位置设置为不可见

.ui-helper-clearfix:适用于浮动包裹父元素的属性

. ui-helper-zfix:适用于修复iframe元素覆盖的问题

.ui-state-default:元素的默认样式

.ui-state-hover:元素为hover状态的样式

.ui-state-focus:元素为focus状态的样式

.ui-state-active:元素为active状态(一般为鼠标选中)的样式

.ui-state-hightlight:需要高亮状态的样式

.ui-state-error:元素为错误状态(一般描述错误信息)的样式

.ui-state-error-text:描述错误文字的样式

.ui-state-disabled:元素被禁用的样式

.ui-priority-primary:被应用于级别为第一级的button,如果button需要区分曾记的话。将应用加粗字体

.ui-priority-secondary:被应用于级别为第二级的button,和上一场景相对应,将应用一般粗细的字体,并且相对于元素轻度透明

Icon types:css framework提供了一套默认的图标,这些图标适用于大多场景,一般使用的方式是“ui-icon ui-icon-****”来指定icon

.ui-corner-tl:左上角圆角,基于css3ie不支持

.ui-corner-tr:右上角圆角,基于css3ie不支持

.ui-corner-bl:左下角圆角,基于css3ie不支持

.ui-corner-br:右下角圆角,基于css3ie不支持

.ui-corner-top:上面两个角圆角,基于css3ie不支持

.ui-corner-bottom:底部两个角圆角,基于css3ie不支持

.ui-corner-right:右部两个角圆角,基于css3ie不支持

.ui-corner-left:左部两个角圆角,基于css3ie不支持

.ui-corner-all:全部角圆角,基于css3ie不支持

.ui-widget-overlay:遮罩

.ui-widget-shadow:阴影

在写jquery ui widget的时候合适的利用这些css就可以做出和jquery ui theme兼容的自定义ui来。

Jquery ui widget开发

Jquery ui 提供了一些基本的widget,但是他提供了很好的机制来创建widget。在jquery css framework中包含了基本的css样式(视觉和感觉诸如颜色,字体大小,图标等),而在ui的css中,则需要定义构建widget结构的css,比如margin,padding,position等。在开发widget的时候也要尽量遵循这一原则,这样才能很好的利用jquery theme roller来应用样式,从而在整体上保持一致,在前面的文章中简单的 介绍了jquery css framework。下面就简单的介绍下jquery ui 的开发指引

Jquery的官方文档中对此写的很清晰。一般来说,jquery ui都是继承自jquery.ui.widget.js这个文件的。这个文件提供了一个工厂方法来创建widget对象。其方法是$.widget(String name, Options prototype).下面简单介绍下这个类提供的方法和属性。在创建widget的时候将重写这些。

destroy():将widget实例从dom对象上移除,在开发widget的时候一般此方法是必须的。就是移除你自己在dom element上添加的样式和行为以及dom结构

options:在这里面保存的是widget的配置信息,在创建widget的时候需要设置一些配置参数。

element:就是widget作用的dom对象。

enable()和disable()这两个方法就是禁用和启用widget的。其实是修改options.disabled。

还有两个私有方法是创建widget的时候要重写的。

_create() 这个方法就是创建widget的方法,在页面调用widget的时候,就会执行此方法,来构建widget。Widget的绝大大多数行为和结构都是在这里创建的。

_init() 这个方法大多数时候不会被重写,这个方法在构建widget的时候在_create后执行。从相关的文档上查询到:

_create()方法在widget构建的时候执行,而_init()方法在构建和重新初始化的时候执行。而destroy方法则是在移除widget的时候被执行。在widget中,所有的私有方法都将加以"_"前缀

_setOption():此方法提供了options的属性的设置,一般情况下如果options里面的参数不需要特殊处理(校验,类型转换,以及设置属性的时候触发某一操作等)的时候不需要对此方法进行重写事件

如果有自定义的事件,可以采用widget为我们封装好的方法来处理_trigger()这个方法来处理,其调用方法 this._trigger(type, event, data),第一个参数为时间类型,第二个参数为事件event对象,第三个参数为事件要传递的参数。

说明:widget被创建的时候,_create()_init()都会被创建,而当页面再次调用widget方法的时候,则只执行_init()方法。而destroy方法,在remove掉作用的元素的时候会被执行!所以在destroy的方法中必须将widget自己加的html结构删除掉。还原成应用widget前的状态!

对于_create()_init()的区别,以下代码可以说明

$(function(){     // _create() 和 _init() 在第一次调用的时候被执行    $("div").mywidget();     // widget已经实例化到div上了,此时只执行_init()方法    $("div").mywidget();     // 销毁widget    $("div").mywidget("destroy");     // 因为widget已经被销毁,此时_create()和_init()方法都将被执行    $("div").mywidget(); });

一个简单的widget

下面是一个简单的widget例子,代码中有注释。在使用该widget的时候,需要引用jquery,jquery.ui.core.js,jquery.ui.widget.js文件,css文件需要jquery.ui.core.css和jquery.ui.theme.css两个文件。

//此widget是将textbox进行修饰一下的。自身没有css,采用的是jquery ui css framework的样式(function($){//ui默认采用jquery的ui前缀,后面的是widget名称    $.widget("ui.textboxdecorator", {//此widget中没有options        options:{        },        _init: function(){            //验证是否是需要装饰的元素                        if (!(this.element.attr("tagName").toLowerCase() === "input" || this.element.attr("tagName").toLowerCase() === "textarea")) {                return;            }            if (!(this.element.attr("type").toLowerCase() === "text" || this.element.attr("type").toLowerCase() === "password")) {                if (this.element.attr("tagName").toLowerCase() === "input")                     return;            }//this.element也就是调用此widget的元素            var e = this.element;//ui-widget widget基本的样式,ui-state-default。默认状态的样式;ui- corner-all 圆角(基于css3,ie下不起作用)            this.element.addClass("ui-widget ui-state-default ui-corner-all");            //添加hover效果和active效果                        this.element.mouseover(function(){                e.addClass("ui-state-hover");            }).mouseout(function(){                e.removeClass("ui-state-hover");            }).mousedown(function(){                e.addClass("ui-state-active");            }).mouseup(function(){                e.removeClass("ui-state-active");            });        },//销毁时,移除widget增加的样式        destroy:function(){            this.element.removeClass("ui-widget ui-state-default ui-corner-all ui-state-hover ui-state-active");        }            })})(jQuery)

在调用的时候采用$("***"). textboxdecorator();来调用此widget。

下篇文章介绍widget中基本的规范和处理。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 电话话打不通怎么办 公司卖了商标怎么办 商标撕不下来怎么办 商标撕不下来时怎么办 商标还没下来怎么办 商标揭不下来怎么办 手机程序出现异常怎么办 公众号企业名称是*怎么办 家人生命受到威胁怎么办 海淘看不懂英文怎么办 对英语不感兴趣怎么办 装修无合同起诉怎么办 上海离职后档案怎么办 公司注销了银行帐户怎么办 360借条注销了怎么办 注销营业执照公章丢失怎么办 工厂招聘信息有假怎么办 个体餐饮怎么办核名 见父母后接下来怎么办 工商核名重名怎么办 核名通知书过期怎么办 包头鼎太风华怎么办 用人单位不续签劳动合同怎么办 全是英文看不懂怎么办 孩子智力发育晚怎么办 公司比赛成绩不好怎么办 解压手续过期了怎么办 违章通知单丢了怎么办 住在朋友家怎么办暂住证 告知单丢了怎么办 身份证丢了怎么办暂住证 合肥居住证失效了怎么办 异地办牌照暂住证怎么办 外地牌照上保险怎么办 住公租房怎么办暂住证 暂住证怎么办 异地学车 外地人怎么办北京市工作居住证 电大挂科很多怎么办 南通电大挂科怎么办 大学出现挂科怎么办 在北京没暂住证怎么办