Javascript前端UI框架Kit使用指南之kitjs事件管理


Posted in Javascript onNovember 28, 2014

从今天这章开始,我将会着重介绍KitJs的事件管理的内容,尽量用浅显的语言给大家揭露主流的js框架是如何在内部实现自己独立的事件管理功能的。

(一)普通的Dom事件

我们一般可以通过支持在HTML写上事件

<a onclick=”alert(1)”>测试</a>

或者取到dom对象后绑定

document.getElementById(‘a').onclick=function(){alert(1)}

或者二级事件

document.getElementById(‘a').addEventListener(‘click',function(){alert(1)},flase)

或者通过script tag

<script for=”a” event=”onclick”>alert(1)</script>

而W3C标准推荐的是以上的第三种方式绑定,既二级事件的方式,目的是解耦HTML与Js的强依赖

(二)问题

但是如果我们仅仅直接使用方式3的方式进行我们的Js编程的话,还是不够的,因为会遇到以下问题

1. 浏览器兼容性,IE系列和W3C支持的浏览器对于二级事件绑定的方式名,参数都不一致

2. 通过2级事件绑定之后,你无法知道别人对于同一个元素有没有绑定过事件,绑定了哪些事件,事件内容是什么?

3. 通过2级事件绑定的方法触发后,顺序不是按照绑定之前的先后顺序,是随机执行的,可有些时候,我们需要对于触发的方法按照顺序

4. 当同一个元素的事件被触发之后,没有w3c的标准api支持对于同一个元素绑定着的其他事件停止继续触发,w3c支持停止冒泡

5. 很多时候,我们是通过匿名函数的方法注册2级事件的,没有留下注册事件执行方法的句柄,所以很难通过removeEventListener注销该事件

(三)Kit如何解决

ok,js框架就是为了解决以上问题而存在的,让我们看看kit是如何处理以上问题的。

在kit.js的api中,存在一个ev(config)方法

Javascript前端UI框架Kit使用指南之kitjs事件管理

该方法接受一个Map类型的object,里面存在了4个重要参数,

el 需要绑定的元素

String 事件类型

fn 触发执行的方法

scope 可以省略,是否需要指定this指针,如无,则传入注册时的el作为this指针

(四)代码解析

让我们进一步看看代码实现

直接从核心部分看起

Javascript前端UI框架Kit使用指南之kitjs事件管理

如果传入参数不为空,那个在传入参数的el上建立一个对象,用于保存KitJs的事件注册evReg

evReg对象里面有两个子对象,一个叫做evRegEv,保存注册的事件

在evRegEv对象里面,保存一个key为当前注册事件,value为一个数组,数组里面按照先来后到的顺序放入方法ev传入的config参数,注意了,这个是一个数组!!!因为数组可以保存先后顺序,这一点非常重要

还有一个叫做evRegFn,保存事件触发的匿名方法,

Javascript前端UI框架Kit使用指南之kitjs事件管理

Javascript前端UI框架Kit使用指南之kitjs事件管理

我们可以看到evRegFn是一个匿名事件,在开头,他会判断一下global的变量window[me.CONSTANTS.KIT_EVENT_STOPIMMEDIATEPROPAGATION]是否==true,如果是true的话,即会返回,不会再继续执行

接着往下看,他会接受到事件触发的EV对象,给这个EV用mergeIf的方式附加很多对象,像target,currentTarget,relatedTarget是为了解决浏览器兼容性的问题

而stopNow,stopDefault,stopGoOn是为了阻止事件继续触发而创建的方法。

下面这段就是evRegFn的关键了,我们会循环之前创建的那个evRegEv里面的事件数组,按照先后顺序,取出之前的ev方法传入的config参数,执行config参数里面方法,如果方法的返回值不为空,则返回他的返回值

Javascript前端UI框架Kit使用指南之kitjs事件管理

最后做一个浏览器兼容,用2级事件的方式,绑定我们的evRegFn匿名方法。

(五)小结

简单来说,Kit用一个自己的匿名方法,缓存了事件注册的句柄,到一个数组里面,这样就可以记住事件的先后顺序,以及提供入口找出之前注册的事件,参数,方法等等,同时针对浏览器兼容性做了兼容。

(六)注销事件

有了Kit帮忙缓存事件句柄,注销就变得简单了

Javascript前端UI框架Kit使用指南之kitjs事件管理

你可以看到Kit通过直接对比,或者fn.toString对比,以及fn.toString().trim()的方式对比来找到对应的事件config,从数组中删除

(七)事件增强

大家刚才也应该留意到Kit对于系统的Event对象做了一个mergeIf的操作,首先为什么要做megerIf,因为系统的Event的对象属性是Readonly的,不能覆盖,只能添加他没有的属性

所以Kit只能megerIf,我们都知道各个浏览器的事件对象Event Object存在一个不兼容性,所以就需要Kit去fix这些不兼容,比如IE没有target属性,只有srcElement,我们可以给他加上target属性,实现W3c标准的兼容

当然了,仅仅的修复是不能满足我们的需求的,很多时候,我们还需要给Event对象做一点小小的增肥

比如在iphone的touchdown,touchmove开发的时候,我们经常要取到单指的offset,而取单指的offset,又需要ev.targetTouches[0].clientX,这样的代码,但是一旦在匿名函数这样了,在PC上又不兼容了,

怎么办呢,没有关系,我们可以给Event Object mergeIf我们自己的属性

Javascript前端UI框架Kit使用指南之kitjs事件管理

Javascript前端UI框架Kit使用指南之kitjs事件管理

Javascript前端UI框架Kit使用指南之kitjs事件管理

firstFingerClientX等等,这样我们就可以很简单的实现移动端,PC端开发的代码统一了。

包括,下一篇要说HTML5拖拽,高级手势事件都是基于这一基础之上架构的。

补充一下,为什么不像ExtJs那样new一个自己的Event,是因为

1. 系统原生的对象,有一定的继承关系,不想破坏

2. 如果用自己的new Object,可能会造成代码脱离框架之后,不可移植性,需要再次改变代码内容

Javascript 相关文章推荐
javascript 获取iframe里页面中元素值的方法
Feb 17 Javascript
关于JavaScript的变量的数据类型的判断方法
Aug 14 Javascript
JS实现模拟百度搜索“2012世界末日”网页地震撕裂效果代码
Oct 31 Javascript
react-router中的属性详解
Jun 01 Javascript
用vue的双向绑定简单实现一个todo-list的示例代码
Aug 03 Javascript
基于Vue实例生命周期(全面解析)
Aug 16 Javascript
详解webpack3如何正确引用并使用jQuery库
Aug 26 jQuery
Angular实现的简单定时器功能示例
Dec 28 Javascript
深入理解Vue Computed计算属性原理
May 29 Javascript
基于vue.js组件实现分页效果
Dec 29 Javascript
vue 使用element-ui中的Notification自定义按钮并实现关闭功能及如何处理多个通知
Aug 17 Javascript
JavaScript本地储存:localStorage、sessionStorage、cookie的使用
Oct 13 Javascript
Javascript前端UI框架Kit使用指南之kitjs的对话框组件
Nov 28 #Javascript
Javascript前端UI框架Kit使用指南之Kitjs简介
Nov 28 #Javascript
非jQuery实现照片散落桌子上,单击放大的LightBox效果
Nov 28 #Javascript
开源的javascript项目Kissy介绍
Nov 28 #Javascript
对比分析json及XML
Nov 28 #Javascript
jquery 操作css样式、位置、尺寸方法汇总
Nov 28 #Javascript
javascript基本类型详解
Nov 28 #Javascript
You might like
在PHP中使用X-SendFile头让文件下载更快
2014/06/01 PHP
php上传图片生成缩略图(GD库)
2016/01/06 PHP
thinkphp框架实现删除和批量删除
2016/06/29 PHP
php post换行的方法
2020/02/03 PHP
禁止直接访问php文件代码分享
2020/05/05 PHP
JavaScript Date对象 日期获取函数
2010/12/19 Javascript
一个支持任意尺寸的图片上下左右滑动效果
2014/08/24 Javascript
jQuery中:file选择器用法实例
2015/01/04 Javascript
Javascript刷新窗口方法小结
2015/10/21 Javascript
js方法数据验证的简单实例
2016/09/17 Javascript
node.js的事件机制
2017/02/08 Javascript
微信小程序 POST请求的实例详解
2017/09/29 Javascript
vue中使用echarts制作圆环图的实例代码
2018/07/27 Javascript
React项目动态设置title标题的方法示例
2018/09/26 Javascript
JavaScript使用类似break机制中断forEach循环的方法
2018/11/13 Javascript
详解使用angular框架离线你的应用(pwa指南)
2019/01/31 Javascript
Vue+penlayers实现多边形绘制及展示
2020/12/24 Vue.js
Python中的id()函数指的什么
2017/10/17 Python
Python cookbook(字符串与文本)在字符串的开头或结尾处进行文本匹配操作
2018/04/20 Python
python 每天如何定时启动爬虫任务(实现方法分享)
2018/05/21 Python
Python实现注册、登录小程序功能
2018/09/21 Python
详解Python 正则表达式模块
2018/11/05 Python
如何基于Python + requests实现发送HTTP请求
2020/01/13 Python
一款基于css3麻将筛子3D翻转特效的实例教程
2014/12/31 HTML / CSS
科颜氏印度官网:Kiehl’s印度
2021/02/20 全球购物
New delete 与malloc free 的联系与区别
2013/02/04 面试题
电子商务专业毕业生工作推荐信
2013/11/17 职场文书
出国考察邀请函
2014/01/21 职场文书
大学军训自我鉴定大全
2014/09/18 职场文书
2014年卫生保健工作总结
2014/12/08 职场文书
学生保证书
2015/01/16 职场文书
道歉信怎么写
2015/05/12 职场文书
高三毕业感言
2015/07/30 职场文书
创业计划书之蛋糕店
2019/08/29 职场文书
使用Python获取字典键对应值的方法
2022/04/26 Python
Nginx利用Logrotate实现日志分割
2022/05/20 Servers