JS 控件事件小结


Posted in Javascript onOctober 31, 2012

概述:

事件对于控件来说至关重要,控件的消息通信机制使用事件的成本最低,但是对于JS控件来说有一些麻烦需要解决,JS类本身不支持事件,DOM模型支持的事件仅适应于浏览器的DOM节点。所以创建一套事件是我们写控件之前要做的。

事件机制

对于事件的机制我不想多说,各种语言中对事件的描述都很具体,都是观察者模式的一种实现,我们可以从中抽取出事件必须的接口(由于控件库是基于jQuery 所以接口跟jquery保持一致):

1.on: 绑定事件

2.off: 删除事件

3.fire: 触发事件

4.addTarget : 添加冒泡的对象

5.publish: 允许事件冒泡

jQuery 中的事件

jQuery 中的事件功能缺失很丰富,但是必须是jQuery对象才支持,我们自己定义的控件类无法直接使用jQuery的事件,事件的上下文也有问题,所以我们需要自己封装控件的事件。

jQuery 中的 Callbacks 是 1.7中添加的用于回调的机制,使用起来很方便,但是问题也是指定上下文需要在触发时指定,我们可以将其封装到我们自己的事件类中。

绑定事件:

函数原型: function on(eventType,callback) 参数:
1.eventType : 事件类型
2.callback : 回调函数
3.scope : 回调函数的上下文,这个变量在真正的控件绑定过程中使用的非常少,而且都有替代方案,所以为了简单起见,scope变量在此函数和下面的所有函数中就引入了。

上面回调函数的上下文是绑定事件的控件本身

删除绑定:
函数原型 : function off(eventType,callback) 参数同上:

1.eventType : 事件类型
2.callback : 回调函数,此变量省略时,删除这个事件类型的所有绑定函数。
在真正的控件开发和使用过程中,删除事件比绑定事件要麻烦的多,删除事件时,你需要有绑定事件时函数的引用,如果需要频繁删除添加同一个事件时请考虑使用delegate

触发事件
函数原型: fire(eventType) :

1. eventType : 事件类型,绑定到对象上的此类型的函数执行。

这里有2点需要注意:

1.触发事件的方式,我们这里使用 ‘stopOnFalse'的方式,也就是绑定在同一个事件类型下的函数顺序执行,如果有一个返回值为false,那么下面的函数终止执行。其他触发事件的方式参考 jquery 的 Callbacks 。

2.事件的是否冒泡执行,也就是说,如果一个控件有多个子控件,那么子控件触发点击事件时可以冒泡到父类控件,我们只需要监听父类的冒泡事件即可

事件冒泡

函数原型: function(eventType,bubble) :

1.eventType : 事件类型
2.bubble : 是否冒泡

此函数与 function addTarget(control) 相匹配使用。

addTarget 添加事件冒泡到的对象上,控件实现中,默认指定控件的父控件作为其冒泡的对象。

上面触发事件中讲到的,允许控件事件冒泡有很多好处:

1. 事件绑定后,子控件的添加删除不受影响

2. 事件使用更加方便,不需要去了解控件的内部

跟事件冒泡对应的是委托(delegate和 undelegate),委托依赖于事件冒泡,DOM的事件机制和jQuery都支持委托,这是因为浏览器本身对DOM 事件冒泡的支持,而我们在控件上实现的事件冒泡机制足够我们实现委托的效果,所以委托的接口我们就不实现了。

事件代码实现

具体的代码实现和一些帮助方法我写到下面的代码中,不便于在文章中展开,感兴趣的可以看一下,后面的控件库都是基于这些帮助方法和事件对象的。文件里面的其他帮助方法,在其他章节讲解。

Javascript 相关文章推荐
NiftyCube——轻松实现圆角边框
Feb 20 Javascript
JQuery打造PHP的AJAX表单提交实例
Nov 03 Javascript
解析js中获得父窗口链接getParent方法以及各种打开窗口的方法
Jun 19 Javascript
Javascript操作URL函数修改版
Nov 07 Javascript
三种方式获取XMLHttpRequest对象
Apr 21 Javascript
javascript和jquery实现设置和移除文本框默认值效果代码
Jan 13 Javascript
DOM基础教程之使用DOM + Css
Jan 20 Javascript
7个有用的jQuery代码片段分享
May 19 Javascript
js中利用tagname和id获取元素的方法
Jan 03 Javascript
基于Vue实现tab栏切换内容不断实时刷新数据功能
Apr 13 Javascript
js+canvas实现两张图片合并成一张图片的方法
Nov 01 Javascript
JavaScript正则表达式验证登录实例
Mar 18 Javascript
jQuery事件 delegate()使用方法介绍
Oct 30 #Javascript
fancybox modal的完美解决(右上的X)
Oct 30 #Javascript
基于jquery自己写tab滑动门(通用版)
Oct 30 #Javascript
基于jquery的滚动条滚动固定div(附演示下载)
Oct 29 #Javascript
使用jquery动态加载javascript以减少服务器压力
Oct 29 #Javascript
不使用XMLHttpRequest实现异步加载 Iframe和script
Oct 29 #Javascript
js制作的鼠标悬浮时产生的下拉框效果
Oct 27 #Javascript
You might like
Javascript & DHTML 实例编程(教程)DOM基础和基本API
2007/06/02 Javascript
js数字输入框(包括最大值最小值限制和四舍五入)
2009/11/24 Javascript
Javascript Jquery 遍历Json的实现代码
2010/03/31 Javascript
使用Javascript接收get传递的值的代码
2011/11/30 Javascript
JavaScript中“基本类型”之争小结
2013/01/03 Javascript
jquery选择器原理介绍($()使用方法)
2014/03/25 Javascript
jquery实现的动态回到顶部特效代码
2015/10/28 Javascript
jQuery EasyUi实战教程之布局篇
2016/01/26 Javascript
js实现倒计时及时间对象
2016/11/15 Javascript
iOS + node.js使用Socket.IO框架进行实时通信示例
2017/04/14 Javascript
vue中遇到的坑之变化检测问题(数组相关)
2017/10/13 Javascript
jquery 输入框查找关键字并提亮颜色的实例代码
2018/01/23 jQuery
Vue指令v-for遍历输出JavaScript数组及json对象的常见方式小结
2019/02/11 Javascript
微信小游戏之使用three.js 绘制一个旋转的三角形
2019/06/10 Javascript
Vue实现点击显示不同图片的效果
2019/08/10 Javascript
python中字符串前面加r的作用
2015/06/04 Python
Python基于pygame实现的font游戏字体(附源码)
2015/11/11 Python
Python中第三方库Requests库的高级用法详解
2017/03/12 Python
对python打乱数据集中X,y标签对的方法详解
2018/12/14 Python
python装饰器使用实例详解
2019/12/14 Python
python base64库给用户名或密码加密的流程
2020/01/02 Python
django修改models重建数据库的操作
2020/03/31 Python
30行Python代码实现高分辨率图像导航的方法
2020/05/22 Python
Python 下载Bing壁纸的示例
2020/09/29 Python
详解vscode实现远程linux服务器上Python开发
2020/11/10 Python
2021年值得向Python开发者推荐的VS Code扩展插件
2021/01/25 Python
HTML5应用之文件上传
2016/12/30 HTML / CSS
iphoneX 适配客户端H5页面的方法教程
2017/12/08 HTML / CSS
保加利亚运动鞋购物网站:SneakerStudio.bg
2020/12/23 全球购物
办公文员的工作岗位职责
2013/11/12 职场文书
创业者迈进成功第一步:如何写创业计划书?
2014/03/22 职场文书
党员干部承诺书
2014/03/25 职场文书
建设工地安全标语
2014/06/07 职场文书
我的中国心演讲稿
2014/09/04 职场文书
2015年国庆节演讲稿范文
2015/07/30 职场文书
mysql如何能有效防止删库跑路
2021/10/05 MySQL