jQueryUI如何自定义组件实现代码


Posted in Javascript onNovember 14, 2010

如何开始使用
首先用$.widget()方法开始定义你的组件,它只接收三个参数:第一个是组件名称,第二个是可选的基类组件(默认的基类是$.Widget),第三个是组件的原型。
组件名称必须包含命名空间,要注意的是,官方组件的命名空间是以‘ui'开头的,比如:‘ui.tabs'。我在下面的用‘我'的拼音(‘wo')。

$.widget("yourNamespace.yourWidgetName",[yourBaseWidget],yourWidgetPrototype)

$.Widget基类含有一个重要的属性‘options',它用来定义公有参数,组件初始化时外部调用的参数会覆盖内部定义的参数;以及三个重要的私有的方法‘_create'、‘_init'、‘',前两个相当于构造函数的作用,按顺序执行,_create()方法执行之后会触发'create'事件。 _trigger()方法会将参数中的指定函数标准化为W3C事件,并且触发这个自定义事件。
另外还有三个公有方法‘enable',‘disable',‘destroy',分别表示启用、禁用和销毁组件。
这里很有意思的,是私有方法和公有方法的实现。jQuerUI Widget暴露的方法都是不以‘_'开头的:
// prevent calls to internal methods 
if ( isMethodCall && options.charAt( 0 ) === "_" ) { 
return returnValue; 
}

实际上,jQueryUI Widget还是保留了原始的API,比如这样使用:
var $div = $('.demo:first'); 
var api = $div.data('divZoom'); 
// console.dir(api); 
api.zoomIn(); 
// 对比 
$div.divZoom('zoomIn');

一个实现完全私有变量的小技巧:
(function($) { 
var privateVar = ''; 
$.widget("wo.divZoom",{}); 
})(jQuery)

所有代码
/* 
* @by ambar 
* @create 2010-10-20 
* @update 2010-10-25 
*/ 
(function($) { 
var html = '<div class="icon-zoom">\ 
<span title="zoom in" class="zoom-in">zoom in</span>\ 
<span title="zoom out" class="zoom-out">zoom out</span>\ 
</div>'; 
$.widget("wo.divZoom",{ 
_init : function() { 
var self = this, opt = self.options, tgt = opt.target, $el = self.element ; 
// 初始一次 
if($('div.icon-zoom',$el).length) return; 
$el.append(html); 
self.target = ( tgt == '' ? $el : $el.find(tgt) ); 
// 检测初始值 
var level = self.target.attr(opt.dataPrefix); 
self.target.attr(opt.dataPrefix,level || opt.level[0]); 
self.btnZoomIn = $el.find('span.zoom-in').click( $.proxy(self.zoomIn,self) ); 
self.btnZoomOut = $el.find('span.zoom-out').click( $.proxy(self.zoomOut,self) ); 
}, 
destroy : function(){ 
this.element.find('div.icon-zoom').remove(); 
}, 
options : { 
level : [120,160,200], 
target : '', 
speed : 'normal', 
dataPrefix : 'data-zoom-level', 
zooming : null, 
select : null, 
show : null 
}, 
currentLevel : function(){ 
var self = this, opt = self.options, lvl = Number(self.target.attr(opt.dataPrefix)); 
return $.inArray(lvl,opt.level); 
}, 
zoomIn : function() { 
this.zoom(this.currentLevel() + 1); 
}, 
zoomOut : function() { 
this.zoom(this.currentLevel() - 1); 
}, 
zoom : function(i){ 
var self = this, opt = self.options,lvls = opt.level,$tgt = self.target; 
if( i<=-1 || i>=lvls.length ) return; 
var value = lvls[i], 
originalValue = lvls[self.currentLevel()], 
style = { width:value, height:value }; 
var data = { target : $tgt, css : style, originalCss : {width:originalValue,height:originalValue} }; 
var goon = self._trigger('start',null,data); 
if(!goon) return; 
$tgt.animate(style, 
{ 
duration : opt.speed, 
step : function(val) { 
var css = { width:val, height:val }; 
self._trigger('zooming',null,$.extend({},data,{css:css})); 
}, 
complete : function(){ 
$tgt.attr(opt.dataPrefix,value); 
self._trigger('stop',null,data); 
} 
}); 
} 
}); 
})(jQuery)

在页面上调用
<script src="js/jquery-1.4.4.min.js"></script> 
<script src="js/jquery.ui.widget.js"></script> 
<!-- 自定义的 --> 
<script src="js/jquery.ui.wo.divZoom.js"></script> 
<script type="text/javascript"> 
$(function() { 
$('div.demo').divZoom({ 
target : '>a', 
level : [80,120,160,200], 
zooming : function(e,ui){ 
// console.log(e,ui.css); 
}, 
start : function(e,ui){ 
console.log('开始',this,e.type,ui); 
}, 
stop : function(e,ui) { 
console.log('结束',ui.css); 
} 
}); 
}); 
</script>

示例代码:
<!DOCTYPE HTML> 
<html lang="en-US"> 
<head> 
<meta charset="UTF-8"> 
<title>jQueryUI</title> 
<style type="text/css"> 
#receptacle{width:800px;height:500px;background:#cde;position:relative;} 
#receptacle .demo{width:80px;height:80px;position:absolute;} 
.demo .cont{width:80px;height:80px;display:block;background:#07a;} 
.demo-a{top:30px;left:122px;} 
.demo-b{top:100px;left:400px;} 
.icon-zoom { 
position:absolute; width:63px; height:20px; overflow:hidden; 
background:url(//img.jbzj.com/file_images/photoshop/201011/icon-zoom.png) no-repeat; cursor:pointer; 
} 
.icon-zoom span { width:20px; display:block; text-indent:-999em; float:left; } 
</style> 
<!--<script src="js/jquery.ui.core.js"></script> 
<script src="jquery-1.4.4.min.js"></script> 
<script src="jquery.ui.widget.js"></script> 
<!-- 自定义的 --> 
<script src="jquery.ui.wo.divZoom.js"></script> 

<script type="text/javascript"> 
$(function() { 
$('div.demo').divZoom({ 
target : '>a', 
level : [80,120,160,200], 
zooming : function(e,ui){ 
// console.log(e,ui.css); 
}, 
start : function(e,ui){ 
console.log('开始',this,e.type,ui); 
}, 
stop : function(e,ui) { 
console.log('结束',ui.css); 
} 
}); 
}); 
</script> 
</head> 
<body> 
<p> 
<a href="http://www.cnblogs.com/ambar/archive/2010/11/12/how-to-user-jquery-ui-widget.html">原文</a> 
</p> 
<div id="receptacle"> 
<div class="demo demo-a"> 
<a class="cont" href="#a">a</a> 
</div> 
<div class="demo demo-b"> 
<a class="cont" href="#b">b</a> 
</div> 
</div> 
</body> 
</html>
Javascript 相关文章推荐
在chrome浏览器中,防止input[text]和textarea在聚焦时出现黄色边框的解决方法
May 24 Javascript
javascript修改表格背景色实例代码分享
Dec 10 Javascript
jquery模拟LCD 时钟的html文件源代码
Jun 16 Javascript
js操作cookie保存浏览记录的方法
Dec 25 Javascript
Vue.js动态组件解析
Sep 09 Javascript
javascript 判断当前浏览器版本并判断ie版本
Feb 17 Javascript
JS事件绑定的常用方式实例总结
Mar 02 Javascript
JS+php后台实现文件上传功能详解
Mar 02 Javascript
jQuery实现的鼠标拖动画矩形框示例【可兼容IE8】
May 17 jQuery
JavaScript实现拖拽盒子效果
Feb 06 Javascript
JS实现打砖块游戏
Feb 14 Javascript
js实现数据导出为EXCEL(支持大量数据导出)
Mar 31 Javascript
Jquery常用技巧收集整理篇
Nov 14 #Javascript
为radio类型的INPUT添加客户端脚本(附加实现JS来禁用onClick事件思路代码)
Nov 11 #Javascript
有关DOM元素与事件的3个谜题
Nov 11 #Javascript
入门基础学习 ExtJS笔记(一)
Nov 11 #Javascript
JavaScript类型转换方法及需要注意的问题小结(挺全面)
Nov 11 #Javascript
javascript正则表达式中参数g(全局)的作用
Nov 11 #Javascript
工作中常用到的JS表单验证代码(包括例子)
Nov 11 #Javascript
You might like
PHP的开发框架的现状和展望
2007/03/16 PHP
PHP开发不能违背的安全规则 过滤用户输入
2011/05/01 PHP
php+redis消息队列实现抢购功能
2018/02/08 PHP
PHP中如何使用Redis接管文件存储Session详解
2018/11/28 PHP
SUN的《AJAX与J2EE》全文译了
2007/02/23 Javascript
JavaScript 利用Cookie记录用户登录信息
2009/12/08 Javascript
javaScript同意等待代码实现心得
2011/01/01 Javascript
使用jquery为table动态添加行的实现代码
2011/03/30 Javascript
一个JavaScript的求爱小特效
2014/05/09 Javascript
鼠标经过子元素触发mouseout,mouseover事件的解决方案
2015/07/26 Javascript
JS实现超精简响应鼠标显示二级菜单代码
2015/09/12 Javascript
JavaScript字符串常用的方法
2016/03/10 Javascript
Javascript设计模式之观察者模式(推荐)
2016/03/29 Javascript
详解js中==与===的区别
2017/01/08 Javascript
angularjs实现猜数字大小功能
2020/05/20 Javascript
VUE接入腾讯验证码功能(滑块验证)备忘
2019/05/07 Javascript
回顾Javascript React基础
2019/06/15 Javascript
Python实现快速排序和插入排序算法及自定义排序的示例
2016/02/16 Python
使用Python保存网页上的图片或者保存页面为截图
2016/03/05 Python
解析Python中的__getitem__专有方法
2016/06/27 Python
Python 序列的方法总结
2016/10/18 Python
遗传算法之Python实现代码
2017/10/10 Python
python的Jenkins接口调用方式
2020/05/12 Python
python批量处理多DNS多域名的nslookup解析实现
2020/06/28 Python
Rockport乐步美国官网:风靡美国的白宫鞋
2016/11/24 全球购物
应用服务器有那些
2012/01/19 面试题
Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型
2013/10/30 面试题
酒店仓管员岗位职责
2014/04/28 职场文书
物理学专业自荐信
2014/06/11 职场文书
大学生学习面向未来的赶考思想汇报
2014/09/12 职场文书
三方股份合作协议书
2014/10/13 职场文书
2014年底工作总结
2014/12/15 职场文书
社团个人总结范文
2015/03/05 职场文书
自主招生推荐信格式模板
2015/03/24 职场文书
2015年学校后勤工作总结
2015/04/08 职场文书
Java8利用Stream对列表进行去除重复的方法详解
2022/04/14 Java/Android