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 相关文章推荐
jQuery 学习第七课 扩展jQuery的功能 插件开发
May 17 Javascript
基于jquery的图片的切换(以数字的形式)
Feb 14 Javascript
JSONP 跨域访问代理API-yahooapis实现代码
Dec 02 Javascript
我的Node.js学习之路(三)--node.js作用、回调、同步和异步代码 以及事件循环
Jul 06 Javascript
node.js中的favicon.ico请求问题处理
Dec 15 Javascript
javascript原始值和对象引用实例分析
Apr 25 Javascript
基于JavaScript实现文字超出部分隐藏
Feb 29 Javascript
Bootstrap作品展示站点实战项目2
Oct 14 Javascript
微信小程序 image组件binderror使用例子与js中的onerror区别
Feb 15 Javascript
详解ES6之async+await 同步/异步方案
Sep 19 Javascript
使用JavaScript解析URL的方法示例
Mar 01 Javascript
Vue实现图片轮播组件思路及实例解析
May 11 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
转生史莱姆:萌王第一次撸串开心到飞起,哥布塔撸串却神似界王神
2018/11/30 日漫
php中session与cookie的比较
2015/01/27 PHP
javascript StringBuilder类实现
2008/12/22 Javascript
JavaScript中通过闭包解决只能取得包含函数中任何变量最后一个值的问题
2010/08/12 Javascript
javascript淡入淡出效果的实现思路
2012/03/31 Javascript
jQuery插件实现屏蔽单个元素使用户无法点击
2013/04/12 Javascript
15条JavaScript最佳实践小结
2013/08/09 Javascript
Jquery实现自定义弹窗示例
2014/03/12 Javascript
javasript实现密码的隐藏与显示
2015/05/08 Javascript
Node.js中npm常用命令大全
2016/06/09 Javascript
微信小程序 触控事件详细介绍
2016/10/17 Javascript
JS批量替换内容中关键词为超链接
2017/02/20 Javascript
AngularJS日期格式化常见操作实例分析
2018/05/17 Javascript
vue拖拽组件 vuedraggable API options实现盒子之间相互拖拽排序
2019/07/08 Javascript
解决在Vue中使用axios用form表单出现的问题
2019/10/30 Javascript
ant-design-vue中的select选择器,对输入值的进行筛选操作
2020/10/24 Javascript
[16:56]heroes英雄教学 司夜刺客
2014/09/18 DOTA
[01:17]辉夜杯战队访谈宣传片—EHOME
2015/12/25 DOTA
[43:24]VG vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python实现查找系统盘中需要找的字符
2015/07/14 Python
python生成词云的实现方法(推荐)
2017/06/13 Python
python网络爬虫之如何伪装逃过反爬虫程序的方法
2017/11/23 Python
基于python 爬虫爬到含空格的url的处理方法
2018/05/11 Python
手动安装python3.6的操作过程详解
2020/01/13 Python
python_mask_array的用法
2020/02/18 Python
PyTorch中clone()、detach()及相关扩展详解
2020/12/09 Python
莫斯科绝对前卫最秘密的商店:SVMoscow
2017/10/23 全球购物
TripAdvisor西班牙官方网站:全球领先的旅游网站
2018/01/10 全球购物
世界上最值得信赖的多日游在线市场:TourRadar
2018/07/20 全球购物
2014年乡镇工作总结
2014/11/21 职场文书
2014年小学体育工作总结
2014/12/11 职场文书
离婚协议书范文2014(夫妻感情破裂)
2014/12/14 职场文书
五四青年节活动总结
2015/02/10 职场文书
法人身份证明书
2015/06/18 职场文书
python 定义函数 返回值只取其中一个的实现
2021/05/21 Python
python pygame入门教程
2021/06/01 Python