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 相关文章推荐
Javascript SHA-1:Secure Hash Algorithm
Dec 20 Javascript
让回调函数 showResponse 也带上参数的代码
Aug 13 Javascript
基于jquery的弹出提示框始终处于窗口的居中位置(类似于alert弹出框的效果)
Sep 28 Javascript
javascript垃圾收集机制与内存泄漏详细解析
Nov 11 Javascript
jquery数组之存放checkbox全选值示例代码
Dec 20 Javascript
javascript实现了照片拖拽点击置顶的照片墙代码
Apr 03 Javascript
jquery+json实现数据二级联动的方法
Nov 28 Javascript
JavaScript匿名函数之模仿块级作用域
Dec 12 Javascript
JS实现前端缓存的方法
Sep 21 Javascript
canvas轨迹回放功能实现
Dec 20 Javascript
vue 实现边输入边搜索功能的实例讲解
Sep 16 Javascript
微信小程序webSocket的使用方法
Feb 20 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
一个更简单的无限级分类菜单代码
2007/01/16 PHP
40个迹象表明你还是PHP菜鸟
2008/09/29 PHP
php中根据某年第几天计算出日期年月日的代码
2011/02/24 PHP
PHP读取CURL模拟登录时生成Cookie文件的方法
2014/11/04 PHP
CI框架入门示例之数据库取数据完整实现方法
2014/11/05 PHP
使用PHP和JavaScript判断请求是否来自微信内浏览器
2015/08/18 PHP
基于php流程控制语句和循环控制语句(讲解)
2017/10/23 PHP
PHP的JSON封装、转变及输出操作示例
2019/09/27 PHP
tp5框架的增删改查操作示例
2019/10/31 PHP
jQuery帮助之筛选查找 children([expr])
2011/01/31 Javascript
JS对img标签进行优化使用onerror显示默认图像
2014/04/24 Javascript
javascript中局部变量和全局变量的区别详解
2015/02/27 Javascript
jQuery 判断是否包含在数组中Array[]的方法
2016/08/03 Javascript
JavaScript使用Range调色及透明度实例
2016/09/25 Javascript
js实现分页功能
2017/05/24 Javascript
BootStrap模态框闪退问题实例代码详解
2018/12/10 Javascript
微信小程序调用微信支付接口的实现方法
2019/04/29 Javascript
JavaScript中工厂函数与构造函数示例详解
2019/05/06 Javascript
浅谈ECMAScript 中的Array类型
2019/06/10 Javascript
解决vue初始化项目时,一直卡在Project description上的问题
2019/10/31 Javascript
零基础写python爬虫之打包生成exe文件
2014/11/06 Python
python中urlparse模块介绍与使用示例
2017/11/19 Python
virtualenv 指定 python 解释器的版本方法
2018/10/25 Python
Python 脚本获取ES 存储容量的实例
2018/12/27 Python
详解Python字典的操作
2019/03/04 Python
Django框架使用内置方法实现登录功能详解
2019/06/12 Python
Windows+Anaconda3+PyTorch+PyCharm的安装教程图文详解
2020/04/03 Python
python查询MySQL将数据写入Excel
2020/10/29 Python
python 实现图片裁剪小工具
2021/02/02 Python
HTML5、Select下拉框右边加图标的实现代码(增进用户体验)
2017/10/16 HTML / CSS
荷兰超市:DEEN
2018/03/14 全球购物
韩国江南富人区高端时尚百货商场:Galleria(格乐丽雅)
2018/03/27 全球购物
德国价格合理的品牌商品购物网站:averdo
2019/03/21 全球购物
英国绿色商店:Natural Collection
2019/05/03 全球购物
2015年教务主任工作总结
2015/07/22 职场文书
uniapp开发打包多端应用完整方法指南
2022/12/24 Javascript