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 相关文章推荐
js同时按下两个方向键
Dec 01 Javascript
Javascript 中文字符串处理额外注意事项
Nov 15 Javascript
Jquery 滑入滑出效果实现代码
Mar 27 Javascript
关于juqery radio写法的兼容性问题(新老版本jquery)
Jun 14 Javascript
深入理解(function(){... })();
Aug 16 Javascript
归纳下js面向对象的几种常见写法总结
Aug 24 Javascript
微信小程序 教程之条件渲染
Oct 18 Javascript
JS实现问卷星自动填问卷脚本并在两秒自动提交功能
Jun 17 Javascript
详解小程序rich-text对富文本支持方案
Nov 28 Javascript
详解Vue中使用Axios拦截器
Apr 22 Javascript
微信小程序云开发之使用云数据库
May 17 Javascript
vue-cli或vue项目利用HBuilder打包成移动端app操作
Jul 29 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
smarty+adodb+部分自定义类的php开发模式
2006/12/31 PHP
PHP5中的this,self和parent关键字详解教程
2007/03/19 PHP
PHP中使用Imagick读取pdf并生成png缩略图实例
2015/01/21 PHP
使用GDB调试PHP代码,解决PHP代码死循环问题
2015/03/02 PHP
PHP实现webshell扫描文件木马的方法
2017/07/31 PHP
Js制作简单弹出层DIV在页面居中 中间显示遮罩的具体方法
2013/08/08 Javascript
js实现键盘操作实现div的移动或改变的原理及代码
2014/06/23 Javascript
基于jquery和svg实现超炫酷的动画特效
2014/12/09 Javascript
node.js中的fs.read方法使用说明
2014/12/17 Javascript
JQuery显示隐藏DIV的方法及代码实例
2015/04/16 Javascript
原生JavaScript实现滚动条效果
2020/03/24 Javascript
JS组件中bootstrap multiselect两大组件较量
2016/01/26 Javascript
新入门node.js必须要知道的概念(必看篇)
2016/08/10 Javascript
vue+vuex+axios实现登录、注册页权限拦截
2018/03/09 Javascript
vue实现键盘输入支付密码功能
2018/08/18 Javascript
微信小程序wx.request的简单封装
2019/11/13 Javascript
Jquery+AJAX实现无刷新上传并重命名文件操作示例【PHP后台接收】
2020/05/29 jQuery
小程序实现多个选项卡切换
2020/06/19 Javascript
Vue中的this.$options.data()和this.$data用法说明
2020/07/26 Javascript
vue实现几秒后跳转新页面代码
2020/09/09 Javascript
原生js+canvas实现验证码
2020/11/29 Javascript
[07:59]2014DOTA2叨叨刀塔 林熊猫称被邀请赛现场盛况震撼
2014/07/21 DOTA
[00:33]2018DOTA2亚洲邀请赛TNC出场
2018/04/04 DOTA
sublime text 3配置使用python操作方法
2017/06/11 Python
python实现校园网自动登录的示例讲解
2018/04/22 Python
Python 实现大整数乘法算法的示例代码
2019/09/17 Python
Python调用.NET库的方法步骤
2019/12/27 Python
Python趣味入门教程之循环语句while
2020/08/26 Python
CSS3+DIV实现漂亮的动画彩色标签
2016/06/16 HTML / CSS
使用canvas绘制超炫时钟
2014/12/17 HTML / CSS
大学毕业登记表自我鉴定
2013/10/09 职场文书
对孩子的寄语
2014/04/09 职场文书
自强自立美德少年事迹材料
2014/08/16 职场文书
2014年小学少先队工作总结
2014/12/18 职场文书
初中同学会致辞
2015/08/01 职场文书
基于Python实现股票收益率分析
2022/04/02 Python