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 相关文章推荐
GRID拖拽行的实例代码
Jul 18 Javascript
jQuery滚动条插件nanoscroller使用指南
Apr 21 Javascript
Javascript获取数组中的最大值和最小值的方法汇总
Jan 01 Javascript
JS遍历数组和对象的区别及递归遍历对象、数组、属性的方法详解
Jun 14 Javascript
js捕捉键盘事件和按键键值的方法
Oct 10 Javascript
js 作用域和变量详解
Feb 16 Javascript
Angular.JS中的指令引用template与指令当做属性详解
Mar 30 Javascript
JavaScript中arguments和this对象用法分析
Aug 08 Javascript
Vue CLI3搭建的项目中路径相关问题的解决
Sep 17 Javascript
一次微信小程序内地图的使用实战记录
Sep 09 Javascript
基于js实现逐步显示文字输出代码实例
Apr 02 Javascript
Vue 请求传公共参数的操作
Jul 31 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
珊瑚虫IP库浅析
2007/02/15 PHP
php 魔术方法详解
2014/11/11 PHP
php使用parse_url和parse_str解析URL
2015/02/22 PHP
PHP 中 DOMDocument保存xml时中文出现乱码问题的解决方案
2016/09/19 PHP
PHP文件与目录操作示例
2016/12/24 PHP
实例讲解YII2中多表关联的使用方法
2017/07/21 PHP
PHP面向对象程序设计之对象的遍历操作示例
2019/06/12 PHP
javascript中常用编程知识
2013/04/08 Javascript
javascript与cookie 的问题详解
2013/11/11 Javascript
NodeJS学习笔记之网络编程
2014/08/03 NodeJs
jqueryUI里拖拽排序示例分析
2015/02/26 Javascript
jQuery判断一个元素是否可见的方法
2015/06/05 Javascript
JavaSciprt中处理字符串之sup()方法的使用教程
2015/06/08 Javascript
js实现跨域的方法实例详解
2015/06/24 Javascript
js实现大转盘抽奖游戏实例
2015/06/24 Javascript
jquery实现图片上传之前预览的方法
2015/07/11 Javascript
谈谈我对JavaScript DOM事件的理解
2015/12/18 Javascript
JavaScript常用数组算法小结
2016/02/13 Javascript
Highcharts入门之基本属性
2016/08/02 Javascript
学习使用Bootstrap页面排版样式
2017/05/11 Javascript
Vue单文件组件的如何使用方式介绍
2017/07/28 Javascript
浅谈webpack 构建性能优化策略小结
2018/06/13 Javascript
详解Angular-ui-BootStrap组件的解释以及使用
2018/07/13 Javascript
vue 实现微信浮标效果
2019/09/01 Javascript
Python的高级Git库 Gittle
2014/09/22 Python
python 阶乘累加和的实例
2019/02/01 Python
使用pymysql查询数据库,把结果保存为列表并获取指定元素下标实例
2020/05/15 Python
乐高西班牙官方商店:LEGO Shop ES
2019/12/01 全球购物
办公室内勤岗位职责范本
2013/12/09 职场文书
关于幼儿的自我评价
2013/12/18 职场文书
踏青活动策划方案
2014/08/19 职场文书
2015年文明创建工作总结
2015/04/30 职场文书
关于元旦的广播稿2016
2015/12/17 职场文书
2019自荐信范文集锦!
2019/07/03 职场文书
《鲁班学艺》读后感3篇
2019/11/27 职场文书
nginx配置虚拟主机的详细步骤
2021/07/21 Servers