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 相关文章推荐
爱恋千雪-US-AscII加密解密工具(网页加密)下载
Jun 06 Javascript
JS 事件绑定函数代码
Apr 28 Javascript
从零开始学习jQuery (四) jQuery中操作元素的属性与样式
Feb 23 Javascript
Javascript检查图片大小不要让大图片撑破页面
Nov 04 Javascript
javascript实现鼠标移到Image上方时显示文字效果的方法
Aug 07 Javascript
JavaScript实现的多种鼠标拖放效果
Nov 03 Javascript
AngularJS监听路由变化的方法
Mar 07 Javascript
微信小程序 action-sheet 反馈上拉菜单简单实例
May 11 Javascript
create-react-app中添加less支持的实现
Nov 15 Javascript
微信小程序用户盒子、宫格列表的实现
Jul 01 Javascript
vue-cli3配置favicon.ico和title的流程
Oct 27 Javascript
详解CocosCreator项目结构机制
Apr 14 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
function.inc.php超越php
2006/12/09 PHP
PHP处理SQL脚本文件导入到MySQL的代码实例
2014/03/17 PHP
Javascript操纵Cookie实现购物车程序
2006/11/23 Javascript
JS解析XML的实现代码
2009/11/12 Javascript
javascript时间函数大全
2014/06/30 Javascript
JQuery中层次选择器用法实例详解
2015/05/18 Javascript
JS原型链怎么理解
2016/06/27 Javascript
Laravel整合Bootstrap 4的完整方案(推荐)
2018/01/25 Javascript
深入浅析Vue.js计算属性和侦听器
2018/05/05 Javascript
微信小程序用户授权弹窗 拒绝时引导用户重新授权实现
2019/07/29 Javascript
Vue内部渲染视图的方法
2019/09/02 Javascript
[03:32]2014DOTA2西雅图邀请赛 CIS外卡赛赛前black专访
2014/07/09 DOTA
Python fileinput模块使用实例
2015/05/28 Python
尝试用最短的Python代码来实现服务器和代理服务器
2016/06/23 Python
基于使用paramiko执行远程linux主机命令(详解)
2017/10/16 Python
详解K-means算法在Python中的实现
2017/12/05 Python
python对日志进行处理的实例代码
2018/10/06 Python
python计算两个矩形框重合百分比的实例
2018/11/07 Python
对python中list的拷贝与numpy的array的拷贝详解
2019/01/29 Python
对Python协程之异步同步的区别详解
2019/02/19 Python
使用python绘制cdf的多种实现方法
2020/02/25 Python
Python内置函数property()如何使用
2020/09/01 Python
python打包生成so文件的实现
2020/10/30 Python
CSS3实现滚动条动画效果代码分享
2016/08/03 HTML / CSS
使用html5 canvas绘制圆环动效
2019/06/03 HTML / CSS
使用Html5 Stream开发实时监控系统
2020/06/02 HTML / CSS
意大利制造的男鞋和女鞋:SCAROSSO
2018/03/07 全球购物
澳大利亚当地最大的时装生产商:Cue
2018/08/06 全球购物
PHP中如何创建和修改数组
2012/05/02 面试题
集中整治工作方案
2014/05/01 职场文书
村级环境卫生整治方案
2014/05/04 职场文书
2014年女职工工作总结
2014/11/27 职场文书
写给老婆的保证书
2015/02/27 职场文书
中学生清明节演讲稿
2015/03/18 职场文书
导游词之太原天龙山
2020/01/02 职场文书
HTML5页面音频自动播放的实现方式
2021/06/21 HTML / CSS