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 相关文章推荐
JavaScript Undefined,Null类型和NaN值区别
Oct 22 Javascript
js 未结束的字符串常量错误解决方法
Jun 13 Javascript
Javascript实现返回上一页面并刷新的小例子
Dec 11 Javascript
javascript中的undefined和not defined区别示例介绍
Feb 26 Javascript
JavaScript+html5 canvas制作的百花齐放效果完整实例
Jan 26 Javascript
基于jQuery实现select下拉选择可输入附源码下载
Feb 03 Javascript
基于Bootstrap的网页设计实例
Mar 01 Javascript
jQuery插件ImgAreaSelect实现头像上传预览和裁剪功能实例讲解一
May 26 jQuery
Vue中v-for的数据分组实例
Mar 07 Javascript
AngularJs用户输入动态模板XSS攻击示例详解
Apr 21 Javascript
vue $set 给数据赋值的实例
Nov 09 Javascript
vue mvvm数据响应实现
Nov 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
解析smarty模板中类似for的功能实现
2013/06/18 PHP
两个php日期控制类实例
2014/12/09 PHP
php中将一个对象保存到Session中的方法
2015/03/13 PHP
php 删除指定文件夹的实例讲解
2017/07/25 PHP
Ajax+Json 级联菜单实现代码
2009/10/27 Javascript
JavaScript判断一个URL链接是否有效的实现方法
2011/10/08 Javascript
javascript 实现 秒杀,团购 倒计时展示的记录 分享
2013/07/12 Javascript
jquery使用ajax实现微信自动回复插件
2014/04/28 Javascript
用原生js做个简单的滑动效果的回到顶部
2014/10/15 Javascript
JS实现类似51job上的地区选择效果示例
2016/11/17 Javascript
JavaScript数组,JSON对象实现动态添加、修改、删除功能示例
2018/05/26 Javascript
jQuery实现获取form表单内容及绑定数据到form表单操作分析
2018/07/03 jQuery
Jquery实现获取子元素的方法分析
2019/08/24 jQuery
vue登录注册实例详解
2019/09/14 Javascript
VUE实现吸底按钮
2021/03/04 Vue.js
Python 中迭代器与生成器实例详解
2017/03/29 Python
Python 装饰器使用详解
2017/07/29 Python
Windows下Anaconda2安装NLTK教程
2018/09/19 Python
利用python脚本如何简化jar操作命令
2019/02/24 Python
10招!看骨灰级Pythoner玩转Python的方法
2019/04/15 Python
解决Python中回文数和质数的问题
2019/11/24 Python
初学者学习Python好还是Java好
2020/05/26 Python
Keras 在fit_generator训练方式中加入图像random_crop操作
2020/07/03 Python
PyCharm设置注释字体颜色以及是否倾斜的操作
2020/09/16 Python
POP文化和音乐灵感的时尚:Hot Topic
2019/06/19 全球购物
HR喜欢的自荐信格式
2013/10/08 职场文书
创业计划书撰写原则
2014/01/25 职场文书
音乐教学随笔感言
2014/02/19 职场文书
专题组织生活会方案
2014/06/15 职场文书
个人四风对照检查材料
2014/09/26 职场文书
网球场地租赁协议范本
2014/10/07 职场文书
2014年科室工作总结
2014/11/20 职场文书
酒会开场白大全
2015/06/01 职场文书
css3实现的加载动画效果
2021/04/07 HTML / CSS
详解Go语言运用广度优先搜索走迷宫
2021/06/23 Python
pandas数值排序的实现实例
2021/07/25 Python