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 相关文章推荐
ie 处理 gif动画 的onload 事件的一个 bug
Apr 12 Javascript
JQuery 初体验(建议学习jquery)
Apr 25 Javascript
Javascript select下拉框操作常用方法
Nov 09 Javascript
JSQL 批量图片切换的实现代码
May 05 Javascript
最简单的JavaScript验证整数、小数、实数、有效位小数正则表达式
Apr 17 Javascript
jQuery simplePage+AJAX plus分页插件用法实例
Feb 17 Javascript
Vue.js 父子组件通讯开发实例
Sep 06 Javascript
快速实现JS图片懒加载(可视区域加载)示例代码
Jan 04 Javascript
ES6新特性之模块Module用法详解
Apr 01 Javascript
Vue中保存数据到磁盘文件的方法
Sep 06 Javascript
Webstorm2016使用技巧(SVN插件使用)
Oct 29 Javascript
Vue elementui字体图标显示问题解决方案
Aug 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
PHP输出控制功能在简繁体转换中的应用
2006/10/09 PHP
php 随机数的产生、页面跳转、件读写、文件重命名、switch语句
2009/08/07 PHP
php 归并排序 数组交集
2011/05/10 PHP
PHP中Array相关函数简介
2016/07/03 PHP
Yii视图CGridView列表用法实例分析
2016/07/12 PHP
你不知道的文件上传漏洞php代码分析
2016/09/29 PHP
AeroWindow 基于JQuery的弹出窗口插件
2011/06/27 Javascript
js修改地址栏URL参数解决url参数问题
2012/12/15 Javascript
JavaScript中检测变量是否存在遇到的一些问题
2013/11/11 Javascript
jquery选择器排除某个DOM元素的方法(实例演示)
2014/04/25 Javascript
jQuery实现返回顶部功能适合不支持js的浏览器
2014/08/19 Javascript
javascript实现的多个层切换效果通用函数实例
2015/07/06 Javascript
一个简单不报错的summernote 图片上传案例
2016/07/11 Javascript
Web安全测试之XSS实例讲解
2016/08/15 Javascript
详解Javascript中prototype属性(推荐)
2016/09/03 Javascript
JS获取多维数组中相同键的值实现方法示例
2017/01/06 Javascript
Jquery树插件zTree实现菜单树
2017/01/24 Javascript
JavaScript无操作后屏保功能的实现方法
2017/07/04 Javascript
JS获取字符对应的ASCII码实例
2017/09/10 Javascript
高性能web服务器框架Tornado简单实现restful接口及开发实例
2014/07/16 Python
一个计算身份证号码校验位的Python小程序
2014/08/15 Python
进一步理解Python中的函数编程
2015/04/13 Python
利用Python实现图书超期提醒
2016/08/02 Python
使用Python如何测试InnoDB与MyISAM的读写性能
2018/09/18 Python
浅谈django rest jwt vue 跨域问题
2018/10/26 Python
Django ManyToManyField 跨越中间表查询的方法
2018/12/18 Python
详解Django配置JWT认证方式
2020/05/09 Python
Python实现http接口自动化测试的示例代码
2020/10/09 Python
一张图片能隐含千言万语之隐藏你的程序代码
2012/12/13 HTML / CSS
西班牙最好的在线购买葡萄酒的商店:Vinoseleccion
2019/10/30 全球购物
2014年综治维稳工作总结
2014/11/17 职场文书
上课睡觉检讨书300字
2014/11/18 职场文书
发布会邀请函
2015/01/31 职场文书
2014年个人年终总结
2015/03/09 职场文书
2015年幼儿园国庆节活动总结
2015/07/30 职场文书
Java使用httpRequest+Jsoup爬取红蓝球号码
2021/07/02 Java/Android