版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、详解javascript实现自定义事件我们平时在操作dom时候经常会用到onclick,onmouseover等一系列浏览器特定行为的事件,那么自定义事件,顾名思义,就是自己定义事件类型,自己定义事件处理函数,在合适的时候需要哪个事件类型,就去调用哪个处理程序1.js所支持的浏览器默认事件浏览器特定行为的事件,或者叫系统事件,js默认事件等等都行,大家知道我指的什么就行,下文我叫他js默认事件。js默认事件的事件绑定,事件移出等一系列操作,相信大家都有用到过,如:/DOM0级事件处理程序var oDiv = document.getElementById('oDiv');oDi
2、v.onclick = function()alert("你点击了我");又或者/DOM2级事件处理程序var oDiv = document.getElementById('oDiv');/非ieoDiv.addEventListener("click",function()alert("你点击了我");,false);/ieoDiv.attachEvent("onclick", function()alert("你点击了我"););所有我就不做过多的研究,毕竟我们来讨论js自
3、定义事件,这里给出一个我之前封装过的处理js默认事件的代码:/跨浏览器的事件处理程序/调用时候直接用domEvent.addEvent( , , );直接调用/使用时候,先用addEvent添加事件,然后在handleFun里面直接写其他函数方法,如getEvent;/addEventListener和attachEvent-都是dom2级事件处理程序var domEvent = /element:dom对象,event:待处理的事件,handleFun:处理函数/事件名称,不含“on”,比如“click”、“mouseover”、“keydown”等addEvent:function(ele
4、ment,event,handleFun)/addEventListener-应用于mozillaif(element.addEventListener)element.addEventListener(event,handleFun,false);/attachEvent-应用于IEelse if(element.attachEvent)element.attachEvent("on"+event,handleFun);/其他的选择dom0级事件处理程序else/element.onclick=element"on"+event;element&quo
5、t;on"+event = handleFun;,/事件名称,含“on”,比如“onclick”、“onmouseover”、“onkeydown”等removeEvent:function(element,event,handleFun)/removeEventListener-应用于mozillaif (element.removeEventListener) element.removeEventListener(event,handleFun,false);/detachEvent-应用于IEelse if (element.detachEvent) element.deta
6、chEvent("on"+event,handleFun);/其他的选择dom0级事件处理程序else element"on"+event = null;,/阻止事件冒泡stopPropagation:function(event)if(event.stopPropagation)event.stopPropagation();elseevent.cancelBubble = true;/IE阻止事件冒泡,true代表阻止,/阻止事件默认行为preventDefault:function(event)if(event.preventDefault)eve
7、nt.preventDefault();elseevent.returnValue = false;/IE阻止事件冒泡,false代表阻止,/获得事件元素/event.target-非IE/event.srcElement-IEgetElement:function(event)return event.target | event.srcElement;,/获得事件getEvent:function(event)return event? event : window.event;,/获得事件类型getType:function(event)return event.type;接下类我们不如
8、正题,js自定义事件2.对象直接量封装js自定义事件根据上面的封装,我们可以这样构思var eventTarget = addEvent: function()/添加事件,fireEvent: function()/触发事件,removeEvent: function()/移除事件;相信这样大家还是比较好理解的,然后又有一个问题大家可以想到,那就是,js默认事件,js可以一一对应,知道那个是那个,那么我们的自定义事件呢,这个一一对应的映射表只能我们自己去建立,然后我这样var eventTarget = /保存映射handlers:,addEvent: function()/处理代码,fire
9、Event: function()/触发代码,removeEvent: function()/移出代码;我是这样构建这个映射关系的handlers = "type1":"fun1","fun2",/ ".","type2":"fun1","fun2"/ "."/"."这样每一个类型可以有多个处理函数,以便于我们以后扩充接下来就是代码方面的实战的,编写具体的处理代码了相信大家对于这个思路已经很清楚了,我直接附上代码/直
10、接量处理js自定义事件var eventTarget = /保存事件类型,处理函数数组映射handlers:,/注册给定类型的事件处理程序,/type -> 自定义事件类型, handler -> 自定义事件回调函数addEvent: function(type, handler)/判断事件处理数组是否有该类型事件if(eventTarget.handlerstype = undefined)eventTarget.handlerstype = ;/将处理事件push到事件处理数组里面eventTarget.handlerstype.push(handler);,/触发一个事件/e
11、vent -> 为一个js对象,属性中至少包含type属性,/因为类型是必须的,其次可以传一些处理函数需要的其他变量参数。(这也是为什么要传js对象的原因)fireEvent: function(event)/判断是否存在该事件类型if(eventTarget.handlersevent.type instanceof Array)var _handler = eventTarget.handlers event.type;/在同一个事件类型下的可能存在多种处理事件,找出本次需要处理的事件for(var i = 0; i < _handler.length; i+)/执行触发_ha
12、ndleri(event);,/注销事件/type -> 自定义事件类型, handler -> 自定义事件回调函数removeEvent: function(type, handler)if(eventTarget.handlerstype instanceof Array)var _handler = eventTarget.handlerstype;/在同一个事件类型下的可能存在多种处理事件,找出本次需要处理的事件for(var i = 0; i < _handler.length; i+)/找出本次需要处理的事件下标if(_handleri = handler)bre
13、ak;/删除处理事件_handler.splice(i, 1);这是一种调用运行的方法eventTarget.addEvent("eat",function()console.log(123); /123);eventTarget.fireEvent(type: "eat");这种方法有一个缺点,不能删除该处理事件,因为我们是用映射表做的,而且也不提倡,直接给映射表里面存这么多数据,有点多。另一种方法,将处理事件提取出来(推荐)function b()console.log(123);eventTarget.addEvent("eat"
14、;,b);eventTarget.fireEvent(type: "eat"); /123eventTarget.removeEvent("eat",b);eventTarget.fireEvent(type: "eat"); /空也可以这样,传递更多的参数eventTarget.fireEvent(type: "eat",food: "banana");function b(data)console.log(data.food); /banana总结:字面量这种方法,有点儿缺点,就是万一一不小
15、心,把某个属性在handler函数里面,赋值null,这样会造成我们的的eventTarget 方法崩盘。看来原型应该是个好方法,更安全一点。3.对象原型封装js自定义事件由于前面思路基本都讲清楚了,这里我直接附上代码,大家可以研究下其中的利弊,或许你可以找到更好的方法解决Ta/自定义事件构造函数function EventTarget()/事件处理程序数组集合this.handlers = ;/自定义事件的原型对象EventTtotype = /设置原型构造函数链constructor: EventTarget,/注册给定类型的事件处理程序,/type -> 自定义事
16、件类型, handler -> 自定义事件回调函数addEvent: function(type, handler)/判断事件处理数组是否有该类型事件if(typeof this.handlerstype = 'undefined')this.handlerstype = ;/将处理事件push到事件处理数组里面this.handlerstype.push(handler);,/触发一个事件/event -> 为一个js对象,属性中至少包含type属性,/因为类型是必须的,其次可以传一些处理函数需要的其他变量参数。(这也是为什么要传js对象的原因)fireEvent
17、: function(event)/模拟真实事件的eventif(!event.target)event.target = this;/判断是否存在该事件类型if(this.handlersevent.type instanceof Array)var handlers = this.handlersevent.type;/在同一个事件类型下的可能存在多种处理事件,找出本次需要处理的事件for(var i = 0; i < handlers.length; i+)/执行触发handlersi(event);,/注销事件/type -> 自定义事件类型, handler -> 自定义事件回调函数removeEvent: function(type, handler)/判断是否存在该事件类型if(this.handlerstype instanceof Array)var handlers = this.handlerstype;/在同一个事件类型下的可能存在多种处理事件for(var
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小学数学教育中情感教育的评价与反馈
- 2024年道路基层石灰土施工协议版
- 学院专业国际交流与合作中的知识产权保护
- WPS编制2024年施工项目协议范本版B版
- 二零二五年度离婚协议中子女教育费用分担协议
- 2024美甲店会员卡销售与服务合同3篇
- 小学语文教学与语感深度培养的实践
- 2024版集成电路布图设计许可合同
- 2025年度舞台布景租赁与设计合同3篇
- 二零二五年度教师公寓项目施工环境保护合同3篇
- 湖北省部分市州2024-2025学年高二(上)期末考试物理试卷(含答案)
- 危急值登记及流程
- 2025寒假 家长会 课件
- 2025年中国国新控股限责任公司招聘2人高频重点提升(共500题)附带答案详解
- 绿城营销策划管理标准化手册
- 采购部5年规划
- 《公路养护安全培训》课件
- 股东合作协议书标准范本
- 干法读书会分享
- 进阶练12 材料作文(满分范文20篇)(解析版)-【挑战中考】备战2024年中考语文一轮总复习重难点全攻略(浙江专用)
- 非营利组织薪酬标准与管理
评论
0/150
提交评论