JS的事件绑定深入认识


Posted in Javascript onJune 26, 2014

一、传统事件模型

传统事件模型中存在局限性。

内联模型以HTML标签属性的形式使用,与HTML混写,这种方式无疑造成了修改以及扩展的问题,已经很少使用了。

脚本模型是将事件处理函数写到js文件中,从页面获取元素进行对应事件函数的绑定以触发执行。但也存在不足之处:

1.一个事件绑定多个事件监听函数,后者将覆盖前者。

2.需要限制重复绑定的情况

3.标准化event对象

二、现代事件绑定

DOM2级事件定义了两个方法用于添加、删除事件:addEventListener()、removeEventListener().他们分别接收三个参数:事件名、函数、冒泡或捕获的布尔值(true表示捕获,false表示冒泡)。

与之对应,IE提供了类似的两个方法attachEvent()和 detachEvent(),但IE的两个方法存在另外的问题:无法传递this对象(IE中的this指向window)可以使用call方法进行对象冒充:

function addEvent(obj,type,fn){ 
if(typeof obj.addEventListener != 'undefined'){ 
obj.addEventListener(type,fn,false); 
}else if(obj.attachEvent != 'undefined'){ 
obj.attachEvent('on' + type,function(){ 
fn.call(obj,window.event); 
}); 
} 
};

但由于添加时执行的是匿名函数,因此添加后无法进行删除;另外IE提供方法还会有无法顺序执行绑定事件、存在内存泄漏的问题。

为了解决这一系列的问题,就有必要对方法进行进一步的封装,对其他浏览器使用DOM2级标准进行,对于IE,采用基于传统模式的添加、删除,思路为:

1.添加是使用JS的散列表存储对象事件,为每一个对象事件分配一个ID值,按添加的调用顺序,先判断是否存在相同的处理函数,不存在的话就依次将事件绑定函数添加到散列表中,这样解决了无法顺序执行以及重复添加的问题

2.删除时进行遍历函数匹配的判断,存在则删除

总结:

之前对JS的事件绑定并没有太深的认识,甚至停留在传统事件绑定模型上,对程序实现上还是认识太浅,这次学习封装库这部分内容时,才学习到很多JS上面向对象的应用。虽说类似于JQuery的这样js库已经实现了很好的数据绑定机制的封装效果,但只知其然,不知其所以然还有会有种蒙在鼓里的感觉,亲自去分析一下具体的实现,会有一种豁然开朗的感觉,也体会到,做好一个兼容性、通用性强的程序更要考虑很多内容,解决很多问题,也正在在这些问题中逐渐清楚很多的。

Javascript 相关文章推荐
js图片自动切换效果处理代码
May 07 Javascript
浅析javascript中function 的 length 属性
May 27 Javascript
jQuery插件bxSlider实现响应式焦点图
Apr 12 Javascript
如何检测JavaScript的各种类型
Jul 30 Javascript
jQuery判断是否存在滚动条的简单方法
Sep 17 Javascript
jquery心形点赞关注效果的简单实现
Nov 14 Javascript
微信小程序获取手机系统信息的方法【附源码下载】
Dec 07 Javascript
vue中动态绑定表单元素的属性方法
Feb 23 Javascript
React中嵌套组件与被嵌套组件的通信过程
Jul 11 Javascript
记一次vue去除#问题处理经过小结
Jan 24 Javascript
json解析大全 双引号、键值对不在一起的情况
Dec 06 Javascript
vue-cli 关闭热更新操作
Sep 18 Javascript
jquery 页眉单行信息滚动显示实现思路及代码
Jun 26 #Javascript
jquery的clone方法应用于textarea和select的bug修复
Jun 26 #Javascript
document.forms用法示例介绍
Jun 26 #Javascript
JS获取当前日期时间并定时刷新示例
Mar 04 #Javascript
使用ajaxfileupload.js实现ajax上传文件php版
Jun 26 #Javascript
一个简单的jQuery插件ajaxfileupload.js实现ajax上传文件例子
Jun 26 #Javascript
php读取sqlite数据库入门实例代码
Jun 25 #Javascript
You might like
2019年漫画销量排行榜:鬼灭登顶 海贼单卷制霸 尾田盛赞鬼灭
2020/03/08 日漫
php批量缩放图片的代码[ini参数控制]
2011/02/11 PHP
php生成shtml类用法实例
2014/12/09 PHP
php实现通用的信用卡验证类
2015/03/24 PHP
从wamp到xampp的升级之路
2015/04/08 PHP
php+html5+ajax实现上传图片的方法
2016/05/14 PHP
php使用FFmpeg接口获取视频的播放时长、码率、缩略图以及创建时间
2016/11/07 PHP
javascript入门·图片对象(无刷新变换图片)\滚动图像
2007/10/01 Javascript
javascript调试之DOM断点调试法使用技巧分享
2014/04/15 Javascript
用jquery.sortElements实现table排序
2014/05/04 Javascript
js实现按钮颜色渐变动画效果
2015/08/20 Javascript
基于Bootstrap的Metronic框架实现条码和二维码的生成及打印处理操作
2016/08/29 Javascript
javascript 解决浏览器不支持的问题
2016/09/24 Javascript
jQuery Ajax实现跨域请求
2017/01/21 Javascript
vue源码学习之Object.defineProperty对象属性监听
2018/05/30 Javascript
Vue子组件向父组件通信与父组件调用子组件中的方法
2018/06/22 Javascript
微信小程序实现滑动切换自定义页码的方法分析
2018/12/29 Javascript
JavaScript实现连连看连线算法
2019/01/05 Javascript
vue获取时间戳转换为日期格式代码实例
2019/04/17 Javascript
微信小程序拼接图片链接无底洞深入探究
2019/09/03 Javascript
vue实现手机号码的校验实例代码(防抖函数的应用场景)
2019/09/05 Javascript
django+js+ajax实现刷新页面的方法
2017/05/22 Python
基于Python的文件类型和字符串详解
2017/12/21 Python
Python3实现的判断回文链表算法示例
2019/03/08 Python
python3 Scrapy爬虫框架ip代理配置的方法
2020/01/17 Python
python爬虫实现POST request payload形式的请求
2020/04/30 Python
HTML5 Video/Audio播放本地文件示例介绍
2013/11/18 HTML / CSS
canvas绘制太极图的实现示例
2020/04/29 HTML / CSS
C#基础面试题
2016/10/17 面试题
中药专业大学生医药工作求职信
2013/10/25 职场文书
婚礼主持词
2014/03/13 职场文书
岗位标兵事迹材料
2014/05/17 职场文书
煤矿安全生产标语
2014/06/06 职场文书
长城导游词400字
2015/01/30 职场文书
欠条格式范本
2015/07/03 职场文书
TypeScript中条件类型精读与实践记录
2021/10/05 Javascript