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事件(Event)知识整理
Oct 11 Javascript
用JS将搜索的关键字高亮显示实现代码
Nov 08 Javascript
原生JavaScript生成GUID的实现示例
Sep 05 Javascript
简述Matlab中size()函数的用法
Mar 20 Javascript
使用JS实现图片展示瀑布流效果(简单实例)
Sep 06 Javascript
jQuery Validate表单验证插件的基本使用方法及功能拓展
Jan 04 Javascript
Vue学习笔记进阶篇之vue-router安装及使用方法
Jul 19 Javascript
聊聊Vue.js的template编译的问题
Oct 09 Javascript
React组件refs的使用详解
Feb 09 Javascript
解决node-sass偶尔安装失败的方法小结
Dec 05 Javascript
JavaScript实现秒杀时钟倒计时
Sep 29 Javascript
vue实现购物车案例
May 30 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
PHP函数spl_autoload_register()用法和__autoload()介绍
2012/02/04 PHP
thinkPHP中session()方法用法详解
2016/12/08 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
2020/02/16 PHP
自适应高度框架 ----属个人收藏内容
2007/01/22 Javascript
js AspxButton的客户端操作
2009/06/26 Javascript
javascript 控制 html元素 显示/隐藏实现代码
2009/09/01 Javascript
一次失败的jQuery优化尝试小结
2011/02/06 Javascript
jquery 查找select ,并触发事件的实现代码
2011/03/30 Javascript
基于jquery的button默认enter事件(回车事件)。
2011/05/18 Javascript
js 取时间差去掉周六周日实现代码
2012/12/25 Javascript
js 判断js函数、变量是否存在的简单示例代码
2014/03/04 Javascript
自己封装的常用javascript函数分享
2015/01/07 Javascript
使用jQuery.Qrcode插件在客户端动态生成二维码并添加自定义Logo
2016/09/01 Javascript
js HTML5多媒体影音播放
2016/10/17 Javascript
jQuery动态添加.active 实现导航效果代码思路详解
2017/08/29 jQuery
vue实现多条件和模糊搜索功能
2019/05/28 Javascript
使用webpack搭建vue项目及注意事项
2019/06/10 Javascript
微信小程序前端自定义分享的实现方法
2019/06/13 Javascript
Vue.js中Line第三方登录api的实现代码
2020/06/29 Javascript
Python牛刀小试密码爆破
2011/02/03 Python
python分析apache访问日志脚本分享
2015/02/26 Python
python实现的简单FTP上传下载文件实例
2015/06/30 Python
深入解析Python中的__builtins__内建对象
2016/06/21 Python
Python OpenCV获取视频的方法
2018/02/28 Python
Python OpenCV 使用滑动条来调整函数参数的方法
2019/07/08 Python
python实现树的深度优先遍历与广度优先遍历详解
2019/10/26 Python
一篇文章搞懂python的转义字符及用法
2020/09/03 Python
matplotlib之属性组合包(cycler)的使用
2021/02/24 Python
美国葡萄酒网上商店:Martha Stewart Wine Co.
2019/03/17 全球购物
房屋租赁协议书
2014/04/10 职场文书
常务副总经理岗位职责
2014/04/12 职场文书
优秀实习生主要事迹
2014/05/29 职场文书
2014年四风问题自我剖析材料
2014/09/15 职场文书
2015毕业生实习期工作总结
2015/04/09 职场文书
莫言获奖感言(全文)
2015/07/31 职场文书
文艺委员竞选稿
2015/11/19 职场文书