基于jQuery UI CSS Framework开发Widget的经验


Posted in Javascript onAugust 21, 2010

jQuery UI中两大核心的css文件是ui.core.css和ui.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:左上角圆角,基于css3,ie不支持
.ui-corner-tr:右上角圆角,基于css3,ie不支持
.ui-corner-bl:左下角圆角,基于css3,ie不支持
.ui-corner-br:右下角圆角,基于css3,ie不支持
.ui-corner-top:上面两个角圆角,基于css3,ie不支持
.ui-corner-bottom:底部两个角圆角,基于css3,ie不支持
.ui-corner-right:右部两个角圆角,基于css3,ie不支持
.ui-corner-left:左部两个角圆角,基于css3,ie不支持
.ui-corner-all:全部角圆角,基于css3,ie不支持
.ui-widget-overlay:遮罩
.ui-widget-shadow:阴影
在写jQuery ui widget的时候合适的利用这些css就可以做出和jQuery ui theme兼容的自定义ui来。
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的时候要重写的。在widget中,所有的私有方法都将加以"_"前缀。
_create(): 这个方法就是创建widget的方法,在页面调用widget的时候,就会执行此方法,来构建widget。Widget的绝大大多数行为和结构都是在这里创建的。
_init(): 这个方法大多数时候不会被重写,这个方法在构建widget的时候在_create后执行。
从相关的文档上查询到:
_create(): 方法在widget构建的时候执行,而_init()方法在构建和重新初始化的时候执行。而destroy方法则是在移除widget的时候被执行。
_setOption(): 此方法提供了options的属性的设置,一般情况下如果options里面的参数不需要特殊处理(校验,类型转换,以及设置属性的时候触发某一操作等)的时候不需要对此方法进行重写。
下面这段代码说明了_create()方法和_init()方法的不同:

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

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

接下来会用一个简单的jquery ui widget代码,来说明如何开发widget。

//此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)

在使用该widget的时候,需要引用jquery,jquery.ui.core.js,jquery.ui.widget.js文件,css文件需要jquery.ui.core.css和jquery.ui.theme.css两个文件
在调用的时候采用$("***"). textboxdecorator();来调用此widget。
Javascript 相关文章推荐
IE之动态添加DOM节点触发window.resize事件
Jul 27 Javascript
jquery 提交值不为空的元素示例代码
May 10 Javascript
自定义jquery模态窗口插件无法在顶层窗口显示问题
May 29 Javascript
jQuery实现TAB风格的全国省份城市滑动切换效果代码
Aug 24 Javascript
Angular表单验证实例详解
Oct 20 Javascript
微信小程序 swiper组件详解及实例代码
Oct 25 Javascript
Node.js中文件操作模块File System的详细介绍
Jan 05 Javascript
JavaScript对JSON数据进行排序和搜索
Jul 24 Javascript
AngularJS遍历获取数组元素的方法示例
Nov 11 Javascript
使用Nuxt.js改造已有项目的方法
Aug 07 Javascript
JS实现数组去重及数组内对象去重功能示例
Feb 02 Javascript
JS中数组实现代码(倒序遍历数组,数组连接字符串)
Dec 29 Javascript
jquery png 透明解决方案(推荐)
Aug 21 #Javascript
基于jquery的模态div层弹出效果
Aug 21 #Javascript
ExtJs 表单提交登陆实现代码
Aug 19 #Javascript
ExtJs中简单的登录界面制作方法
Aug 19 #Javascript
filters.revealTrans.Transition使用方法小结
Aug 19 #Javascript
JS面向对象编程之对象使用分析
Aug 19 #Javascript
JavaScript中各种编码解码函数的区别和注意事项
Aug 19 #Javascript
You might like
无线电广播与收音机发展的历史回眸
2021/03/02 无线电
PHP4与PHP3中一个不兼容问题的解决方法
2006/10/09 PHP
基于PHP文件操作的详细诠释
2013/06/21 PHP
配置php网页显示各种语法错误
2013/09/23 PHP
2014过年倒计时示例
2014/01/31 PHP
php实现的双向队列类实例
2014/09/24 PHP
Zend Framework教程之Application用法实例详解
2016/03/14 PHP
input按钮的事件处理大全
2010/12/10 Javascript
jquery图片上下tab切换效果
2011/03/18 Javascript
JavaScript 类型的包装对象(Typed Wrappers)
2011/10/27 Javascript
JS验证控制输入中英文字节长度(input、textarea等)具体实例
2013/06/21 Javascript
JavaScript引用类型和基本类型详解
2016/01/06 Javascript
AngularJS实现textarea记录只能输入规定数量的字符并显示
2016/04/26 Javascript
Function.prototype.apply()与Function.prototype.call()小结
2016/04/27 Javascript
AngularJS实现根据变量改变动态加载模板的方法
2016/11/04 Javascript
Ajax与服务器(JSON)通信实例代码
2016/11/05 Javascript
Node.js开发教程之基于OnceIO框架实现文件上传和验证功能
2016/11/30 Javascript
详解jquery validate实现表单验证 (正则表达式)
2017/01/18 Javascript
js实现模糊匹配功能
2017/02/15 Javascript
原生JS实现不断变化的标签
2017/05/22 Javascript
vue 优化CDN加速的方法示例
2018/09/19 Javascript
Vue的属性、方法、生命周期实例代码详解
2019/09/17 Javascript
ES6中let、const的区别及变量的解构赋值操作方法实例分析
2019/10/15 Javascript
[02:18]DOTA2英雄基础教程 育母蜘蛛
2014/01/20 DOTA
[48:32]VGJ.T vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
用Python抢过年的火车票附源码
2015/12/07 Python
Python基于最小二乘法实现曲线拟合示例
2018/06/14 Python
解决python打不开文件(文件不存在)的问题
2019/02/18 Python
详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)
2019/07/01 Python
基于django ManyToMany 使用的注意事项详解
2019/08/09 Python
在python中list作函数形参,防止被实参修改的实现方法
2020/06/05 Python
详解Pandas 处理缺失值指令大全
2020/07/30 Python
pycharm + django跨域无提示的解决方法
2020/12/06 Python
马来西亚与新加坡长途巴士售票网站:BusOnlineTicket.com
2018/11/05 全球购物
社区娱乐活动方案
2014/08/21 职场文书
骨干教师事迹材料
2014/12/17 职场文书