一、传统事件模型

传统事件模型中存在局限性。

内联模型以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学习笔记-事件绑定的更多相关文章

  1. js学习笔记-事件委托

    通过事件委托,你可以把事件处理器绑定到父元素上,避免了把事件处理器添加到多个子级元素上.从而优化性能. 事件代理用到了事件冒泡和目标元素.而任何一个元素的目标元素都是一开始的那个元素. 这里首先要注意 ...

  2. js学习笔记---事件代理

    事件机制可以分为捕获型和冒泡型.捕获型是事件由父级元素(DOM)传递到子元素.冒泡型正好相反.事件机制默认为冒泡型.事件机制可以通过参数指定. 事件委托可以将我们绑定在document上的事件自动绑定 ...

  3. [JS学习笔记]Javascript事件阶段:捕获、目标、冒泡

    当你在浏览器上点击一个按钮时,点击的事件不仅仅发生在按钮上,同时点击的还有这个按钮的容器元素,甚至也点击了整个页面. 事件流 事件流描述了从页面接收事件的顺序,但在浏览器发展到第四代时,浏览器开发团队 ...

  4. WebGL three.js学习笔记 创建three.js代码的基本框架

    WebGL学习----Three.js学习笔记(1) webgl介绍 WebGL是一种3D绘图协议,它把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的 ...

  5. 基于jquery的插件turn.js学习笔记

    基于jquery的插件turn.js学习笔记 简介 turn.js是一个可以实现3d书籍展示效果的jq插件,使用html5和css3来执行效果.可以很好的适应于ios和安卓等触摸设备. How it ...

  6. 【转】Backbone.js学习笔记(二)细说MVC

    文章转自: http://segmentfault.com/a/1190000002666658 对于初学backbone.js的同学可以先参考我这篇文章:Backbone.js学习笔记(一) Bac ...

  7. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  8. vue.js 学习笔记3——TypeScript

    目录 vue.js 学习笔记3--TypeScript 工具 基础类型 数组 元组 枚举 字面量 接口 类类型 类类型要素 函数 函数参数 this对象和类型 重载 迭代器 Symbol.iterat ...

  9. JS学习笔记5_DOM

    1.DOM节点的常用属性(所有节点都支持) nodeType:元素1,属性2,文本3 nodeName:元素标签名的大写形式 nodeValue:元素节点为null,文本节点为文本内容,属性节点为属性 ...

随机推荐

  1. redis源码分析——aofrewrite

    随着redis的运行,aof会不断膨胀(对于一个key会有多条aof日志),导致通过aof恢复数据时,耗费大量不必要的时间.redis提供的解决方案是aof rewrite.根据db的内容,对于每个k ...

  2. c++输出保留固定小数位数

    cout<<setprecision(6)<<fixed<<ans<<endl;

  3. linux下查看资源使用情况

    //查看占用内存最多的前K的程序ps aux | sort -k4nr | head -K //查看占用CPU最多的前K的程序 ps aux | sort -k3nr | head -K

  4. html5多媒体Video/Audio

    video:    1.常见的视频格式 视频的组成部分:画面.音频.编码格式 视频编码:H.264.theora.VP8(google开源)      2.常见的音频格式     编码:AAC.MP3 ...

  5. 【转】EventBus 3.0使用详解

    原文:https://www.jianshu.com/p/f9ae5691e1bb 01 前言 当我们进行项目开发的时候,往往是需要应用程序的各组件.组件与后台线程间进行通信,比如在子线程中进行请求数 ...

  6. 什么是APS高级计划排程(生产计划排产)系统主要功能模块有哪些?

    什么是APS高级计划排程(生产计划排产)系统? APS高级计划排程(高级计划排产)系统主要解决“在有限产能条件下,交期产能精确预测.工序生产与物料供应最优详细计划”的问题.APS高级计划排程(高级计划 ...

  7. 三 Python解释器

    当我们编写Python代码时,我们得到的是一个包含Python代码的以.py为扩展名的文本文件.要运行代码,就需要Python解释器去执行.py文件. 由于整个Python语言从规范到解释器都是开源的 ...

  8. SASS详解之混合(mixins)

    SASS详解之混合(mixins)可以出现在SASS的任何地方.有很多类名具有相同或者相似的样式,就可以用SASS中的混合(mixins)来进行编写,然后针对不同类名的不同样式逐一编写. 定义一个混合 ...

  9. React学习笔记2017-12-31

    课程:https://coding.imooc.com/class/chapter/150.html 第一章:介绍 第二章:知识储备 React开发环境 1.安装Nodejs 2.安装Visual S ...

  10. FastReport.Net使用:[33]高亮显示

    1.首先来看下初始报表,很简单很普通. 2.下面对报表改进,90分以上的成绩以绿色显示,60~70分的以橙色斜体显示. 报表设计中选择数据成绩文本框,然后点击工具栏上的“ab突出显示”按钮打开“高亮显 ...