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判断选择时间不能小于当前时间的示例代码
Sep 24 Javascript
js统计页面的来访次数实现代码
May 09 Javascript
javascript在IE下trim函数无法使用的解决方法
Sep 12 Javascript
Javascript 拖拽雏形中的一些问题(逐行分析代码,让你轻松了拖拽的原理)
Jan 23 Javascript
JavaScript实现模仿桌面窗口的方法
Jul 18 Javascript
详解Vue 2.0封装axios笔记
Jun 22 Javascript
聊聊Vue.js的template编译的问题
Oct 09 Javascript
Webpack之tree-starking 解析
Sep 11 Javascript
JavaScript的词法结构精华篇
Oct 17 Javascript
react写一个select组件的实现代码
Apr 03 Javascript
Vue axios 将传递的json数据转为form data的例子
Oct 29 Javascript
vue-i18n实现中英文切换的方法
Jul 06 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
jquery里的正则表达式说明
2011/08/03 Javascript
JQuery中serialize()、serializeArray()和param()方法示例介绍
2014/07/31 Javascript
理解JavaScript事件对象
2016/01/25 Javascript
ES6新特征数字、数组、字符串
2016/10/01 Javascript
搭建Bootstrap离线文档的方法
2016/12/02 Javascript
浅析如何利用angular结合translate为项目实现国际化
2016/12/08 Javascript
微信小程序 数组(增,删,改,查)等操作实例详解
2017/01/05 Javascript
Angular.js中定时器循环的3种方法总结
2017/04/27 Javascript
详解前后端分离之VueJS前端
2017/05/24 Javascript
Vue非父子组件通信详解
2017/06/12 Javascript
使用vue-resource进行数据交互的实例
2017/09/02 Javascript
node.js之基础加密算法模块crypto详解
2018/09/11 Javascript
JavaScript文本特效实例小结【3个示例】
2018/12/22 Javascript
vue使用websocket的方法实例分析
2019/06/22 Javascript
layer.prompt输入层的例子
2019/09/24 Javascript
vue或react项目生产环境去掉console.log的操作
2020/09/02 Javascript
在Python中使用base64模块处理字符编码的教程
2015/04/28 Python
python对url格式解析的方法
2015/05/13 Python
Python实现基本线性数据结构
2016/08/22 Python
Python批量查询域名是否被注册过
2017/06/21 Python
Python通过Pygame绘制移动的矩形实例代码
2018/01/03 Python
Python3 pandas 操作列表实例详解
2019/09/23 Python
python实时监控logstash日志代码
2020/04/27 Python
django中related_name的用法说明
2020/05/20 Python
python 引用传递和值传递详解(实参,形参)
2020/06/05 Python
关于Python3的import问题(pycharm可以运行命令行import错误)
2020/11/18 Python
纯css3显示隐藏一个div特效的具体实现
2014/02/10 HTML / CSS
经济学人订阅:The Economist
2018/07/19 全球购物
中国旅游网站:途牛旅游网
2019/09/29 全球购物
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?
2016/08/18 面试题
服务质量承诺书
2014/03/27 职场文书
食堂厨师岗位职责
2014/08/25 职场文书
学校食品安全责任书
2015/01/29 职场文书
学生会招新宣传语
2015/07/13 职场文书
CSS实现单选折叠菜单功能
2021/11/01 HTML / CSS
Python数据处理的三个实用技巧分享
2022/04/01 Python