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 设置某DIV区域内的checkbox复选框
Nov 30 Javascript
jquery动画4.升级版遮罩效果的图片走廊--带自动运行效果
Aug 24 Javascript
css结合js制作下拉菜单示例代码
Feb 27 Javascript
使用js画图之正弦曲线
Jan 12 Javascript
js实现随屏幕滚动的带缓冲效果的右下角广告代码
Sep 04 Javascript
JavaScript学习笔记之创建对象
Mar 25 Javascript
js方法数据验证的简单实例
Sep 17 Javascript
React路由管理之React Router总结
May 10 Javascript
layui点击导航栏刷新tab页的示例代码
Aug 14 Javascript
jQuery实现的别踩白块小游戏完整示例
Jan 07 jQuery
JS高阶函数原理与用法实例分析
Jan 15 Javascript
vue prop传值类型检验方式
Jul 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 代码规范小结
2012/03/08 PHP
php另类上传图片的方法(PHP用Socket上传图片)
2013/10/30 PHP
destoon实现首页显示供应、企业、资讯条数的方法
2014/07/15 PHP
Zend Framework教程之Zend_Controller_Plugin插件用法详解
2016/03/07 PHP
基于php实现的php代码加密解密类完整实例
2016/10/12 PHP
laravel实现于语言包的完美切换方法
2019/09/29 PHP
TP - 比RBAC更好的权限认证方式(Auth类认证)
2021/03/09 PHP
扩展JavaScript功能的正确方法(译文)
2012/04/12 Javascript
javascript采用数组实现tab菜单切换效果
2012/12/12 Javascript
jQuery ui实现动感的圆角渐变网站导航菜单效果代码
2015/08/26 Javascript
基于jquery插件编写countdown计时器
2016/06/12 Javascript
JS把内容动态插入到DIV的实现方法
2016/07/19 Javascript
VueJS如何引入css或者less文件的一些坑
2017/04/25 Javascript
Vue自定义图片懒加载指令v-lazyload详解
2020/12/31 Javascript
NodeJS、NPM安装配置步骤(windows版本) 以及环境变量详解
2017/05/13 NodeJs
在Vue中使用highCharts绘制3d饼图的方法
2018/02/08 Javascript
vuex与组件联合使用的方法
2018/05/10 Javascript
Python ORM框架SQLAlchemy学习笔记之映射类使用实例和Session会话介绍
2014/06/10 Python
Django的URLconf中使用缺省视图参数的方法
2015/07/18 Python
Python学习笔记整理3之输入输出、python eval函数
2015/12/14 Python
分享Python开发中要注意的十个小贴士
2016/08/30 Python
用Python实现数据的透视表的方法
2018/11/16 Python
Python WEB应用部署的实现方法
2019/01/02 Python
Pytorch实现基于CharRNN的文本分类与生成示例
2020/01/08 Python
详解Python+Selenium+ChromeDriver的配置和问题解决
2021/01/19 Python
css3 给页面加个半圆形导航条主要利用旋转和倾斜样式
2014/02/10 HTML / CSS
Hunter Boots美国官方网站:赫特威灵顿雨靴
2018/06/16 全球购物
全球500多个机场的接送服务:Suntransfers
2019/06/03 全球购物
综合素质的自我鉴定
2013/10/07 职场文书
临床医学专业毕业生的自我评价
2013/10/17 职场文书
公司董事长岗位职责
2014/06/08 职场文书
党委书记个人对照检查材料
2014/09/15 职场文书
2014党员自我评议表范文
2014/09/20 职场文书
2016圣诞节贺卡寄语
2015/12/07 职场文书
用Python爬虫破解滑动验证码的案例解析
2021/05/06 Python
详解Spring事件发布与监听机制
2021/06/30 Java/Android