一、传统事件模型
传统事件模型中存在局限性。
内联模型以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库已经实现了非常好的数据绑定机制的封装效果,但仅仅知其然,不知其所以然还有会有种蒙在鼓里的感觉,亲自去分析一下详细的实现。会有一种豁然开朗的感觉。也体会到,做好一个兼容性、通用性强的程序更要考虑非常多内容。解决非常多问题。也正在在这些问题中逐渐清楚非常多的。
JS学习笔记-事件绑定的更多相关文章
-
js学习笔记-事件委托
通过事件委托,你可以把事件处理器绑定到父元素上,避免了把事件处理器添加到多个子级元素上.从而优化性能. 事件代理用到了事件冒泡和目标元素.而任何一个元素的目标元素都是一开始的那个元素. 这里首先要注意 ...
-
js学习笔记---事件代理
事件机制可以分为捕获型和冒泡型.捕获型是事件由父级元素(DOM)传递到子元素.冒泡型正好相反.事件机制默认为冒泡型.事件机制可以通过参数指定. 事件委托可以将我们绑定在document上的事件自动绑定 ...
-
[JS学习笔记]Javascript事件阶段:捕获、目标、冒泡
当你在浏览器上点击一个按钮时,点击的事件不仅仅发生在按钮上,同时点击的还有这个按钮的容器元素,甚至也点击了整个页面. 事件流 事件流描述了从页面接收事件的顺序,但在浏览器发展到第四代时,浏览器开发团队 ...
-
WebGL three.js学习笔记 创建three.js代码的基本框架
WebGL学习----Three.js学习笔记(1) webgl介绍 WebGL是一种3D绘图协议,它把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的 ...
-
基于jquery的插件turn.js学习笔记
基于jquery的插件turn.js学习笔记 简介 turn.js是一个可以实现3d书籍展示效果的jq插件,使用html5和css3来执行效果.可以很好的适应于ios和安卓等触摸设备. How it ...
-
【转】Backbone.js学习笔记(二)细说MVC
文章转自: http://segmentfault.com/a/1190000002666658 对于初学backbone.js的同学可以先参考我这篇文章:Backbone.js学习笔记(一) Bac ...
-
js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
-
vue.js 学习笔记3——TypeScript
目录 vue.js 学习笔记3--TypeScript 工具 基础类型 数组 元组 枚举 字面量 接口 类类型 类类型要素 函数 函数参数 this对象和类型 重载 迭代器 Symbol.iterat ...
-
JS学习笔记5_DOM
1.DOM节点的常用属性(所有节点都支持) nodeType:元素1,属性2,文本3 nodeName:元素标签名的大写形式 nodeValue:元素节点为null,文本节点为文本内容,属性节点为属性 ...
随机推荐
-
CSS display:inline-block
CSS display:inline-block 在css布局里,我们经常看到代码 「display:inline-block; *display:inline; zoom:1; 」,大多人会说上面的 ...
-
linux下添加mysql用户并授权
-------------------暂停mysqlservice mysqld stop 忘记密码修改流程1,修改mysql配置文件 /etc/my.cnf,在[mysqld]下添加一行skip-g ...
-
C#中的Excel操作【1】——设置Excel单元格的内容,打开Excel文件的一种方式
前言 作为项目管理大队中的一员,在公司里面接触最多的就是Excel文件了,所以一开始就想从Excel入手,学习简单的二次开发,开始自己的编程之路! 程序界面 功能说明 打开文件按钮,可以由使用者指定要 ...
-
bootstrap的下拉框在firefox界面不友好的处理
http://output.jsbin.com/titaki 以上这个链接在firefix浏览器打开就会发现里面有个小容器,而且下拉按钮样式跟不友好 上谷歌查了一下 1.小容器可以利用select:p ...
-
腾讯云部署Flask应用
由于新浪云现在不免费了.而且云豆也用完了.所以去腾讯云申请了个学生云主机,一元一个月. 不过部署开发环境还是有点麻烦的,搞了好几天,终于部署成功了! 下面说部署过程: 我云主机用的是 Ubuntu 1 ...
-
人工智能改进传统云ERP的10种方法
http://blog.itpub.net/31542119/viewspace-2168809/ 随着数字化转型的进程加快,企业开始重新评估ERP的作用.传统ERP经过多年僵硬化定制过于追求生产的一 ...
-
Suricata之outputs(输出选项)
outputs stats.log(统计数据包信息的日志) 配置文件:默认开启,数据包统计时间间隔默认为8S 日志文件:主要统计规定时间间隔内数据包的总量,各种不同类型数据包的数量以及数据包的大小等信 ...
-
内置函数 sorted
内置函数 sorted 语法: sorted(iterable,key = None,reverse= false)iterable: 可迭代的对象key:排序规则(排序函数),在sorted内部将& ...
-
根据不同环境配置pom
clean install clean package -P jt808_dev clean package -P tanway_test -X gps-parent <?xml version ...
-
IDEA打开项目格式问题
今天遇到一个奇葩问题,从git上面迁maven代码下来后,然后打开文件,加载项目,会导致Modules模块加载的内容不正确,出现这种情况,要么删除原来的模块,重新导入main模块,要么采用第三张图片的 ...