js中传统事件绑定模拟现代事件处理
大家都知道,IE中的现代事件绑定(attachEvent)与W3C标准的(addEventListener)相比存在很多问题,
例如:内存泄漏,重复添加事件并触发的时候是倒叙执行等。
下面是用传统事件的方法来处理封装事件的绑定:
添加事件绑定事件:
addEvent.ID = 1; // 事件计数器
function addEvent(obj, type, fn){
if(obj.addEventListener){
obj.addEventListener(type, fn, false);
} else { // IE
// 判断对象是否存在,保证只有一个对象,否则每执行一次,会创建一个事件对象
// 以键值对的形式储存类型与函数的一个数组,=======将事件对象数组挂载到obj对象是为了方便事件的删除
if( !obj.events){
// 相当于结构为:obj.events : {click:[fn1,fn2], mouserover:[fn1], ...}
obj.events = {};
}
var flag = false;
// 存储事件对象
if( !obj.events[type]){
// 类型数据储存挨个函数
obj.events[type] = [];
// 该类型的第一次事件类型及函数储存到该类型数组中的第一位
obj.events[type][0] = fn;
} else {
var eventfn = obj.events[type];
// 循环遍历该类型对象查询该事件是否重复,如果重复flag为true,并return返回
for(var i in eventfn){
if(eventfn[i] == fn ){
flag = true;
return;
}
}
// 判断该事件是否重复,重复的话就不进行事件的函数的存储,否则储存该事件并执行
if( !flag ){
// 当该类型已经存在了,将为该事件进行累计时间类型函数存储,最后循环执行
eventfn[addEvent.ID++] = fn;
} } // 事件函数 类型数组 函数遍历调用
obj["on"+type] = function(){
var event = window.event; // 事件对象的储存 // 在事件对象后添加函数,当执行的时候调用,并阻止默认行为的发生,与W3C标准同步
event.preventDefault = function(){
this.returnValue = false;
};
// 在事件对象后面添加函数,一个尾巴函数,停止冒泡。
event.stopPropagation = function(){
this.cancelBubble = true;
}; // 循环遍历执行类型储存的多个函数
var evfn = obj.events[type];
for(var i in evfn){
// 顺序执行该类型的事件函数,解决了传统事件的覆盖问题和现代事件绑定的逆序触发事件的问题
evfn[i].call(this, event); // 将执行函数放置在该对象的环境下执行,并传递一个事件对象给函数回调使用
}
} }
}
移除事件绑定:
function removeEvent(obj, type, fn){
if(obj.removeEventListener){
obj.removeEventListener(type, fn, false);
} else {
// 循环遍历该对象下该类型的事件函数是否函数该函数,如果有就将该事件函数删除
var evefn = obj.events[type];
for(var i in evefn){
if(evefn[i] == fn){
// delete evefn[i]; 该方法也可以删除该数组的该项,但是会保留该位置当访问的时候值为undefined
evefn.splice( i, 1); // 从第i的位置删除1位,
}
}
}
}
js中传统事件绑定模拟现代事件处理的更多相关文章
- JS 中的事件绑定、事件监听、事件委托
事件绑定 要想让 JavaScript 对用户的操作作出响应,首先要对 DOM 元素绑定事件处理函数.所谓事件处理函数,就是处理用户操作的函数,不同的操作对应不同的名称. 在JavaScript中,有 ...
- JS 中的事件绑定、事件监听、事件委托是什么?
在JavaScript的学习中,我们经常会遇到JavaScript的事件机制,例如,事件绑定.事件监听.事件委托(事件代理)等.这些名词是什么意思呢,有什么作用呢? 事件绑定 要想让 JavaScri ...
- 关于js中对事件绑定与普通事件的理解
普通事件指的是可以用来注册的事件: 事件绑定是指把事件注册到具体的元素之上. 通俗点说: 普通事件:给html元素添加一个特定的属性(如:onclick): 事件绑定:js代码中通过标记(id ta ...
- js中的事件绑定的三种方式
1 直接在html标签中绑定 <button onclick = "show()"></button> 注意当你引用的js代码是包裹在window.onlo ...
- JS中的事件绑定,事件捕获,事件冒泡以及事件委托,兼容IE
转载请注明出处:http://www.cnblogs.com/zhangmingze/p/4864367.html ● 事件分为三个阶段: 事件捕获 --> 事件目标 --> ...
- 理解Javascript中的事件绑定与事件委托
最近在深入实践js中,遇到了一些问题,比如我需要为动态创建的DOM元素绑定事件,那么普通的事件绑定就不行了,于是通过上网查资料了解到事件委托,因此想总结一下js中的事件绑定与事件委托. 事件绑定 ...
- 每日分享!~ JavaScript中面试基础--1,数组检测的方式 2.传统事件绑定和W3C标准绑定事件的区别~
javaScript 那些方式中检测数据类型 typeof typeof isNaN // 结果是function 检测数组的几种方式 instanceof arr instanceof Array( ...
- JS学习笔记-事件绑定
一.传统事件模型 传统事件模型中存在局限性. 内联模型以HTML标签属性的形式使用,与HTML混写.这样的方式无疑造成了改动以及扩展的问题,已经非常少使用了. 脚本模型是将事件处理函数写到js文件里, ...
- 看懂此文,不再困惑于 JS 中的事件设计
看懂此文,不再困惑于 JS 中的事件设计 今天刚在关注的微信公众号看到的文章,关于JS事件的,写的很详细也很容易理解,相关的知识点都有总结到,看完就有种很舒畅的感觉,该串起来的知识点都串起来了.反正一 ...
随机推荐
- IO、FileInputStream、(二十)
1.IO流概述及其分类 * 1.概念(什么是IO?) * IO流用来处理设备之间的数据传输 * Java对数据的操作是通过流的方式 * Java用于操作流的类都在IO包中 * 流按流向分为两种:输入流 ...
- IntelliJ IDEA 注册码 有效期截止于2018/10/14
来源: http://idea.lanyus.com/ IntelliJ IDEA 注册码: EB101IWSWD-eyJsaWNlbnNlSWQiOiJFQjEwMUlXU1dEIiwibGljZW ...
- Oracle:ORA-01790: expression must have same datatype as corresponding expression
今天有现场报sql错误,错误sql语句 类似 select * from tableA where (exists 条件A or exists 条件B), 单独执行 select * f ...
- wukong引擎源码分析之索引——part 3 文档评分 无非就是将docid对应的fields信息存储起来,为搜索结果rank评分用
之前的文章分析过,接受索引请求处理的代码在segmenter_worker.go里: func (engine *Engine) segmenterWorker() { for { request : ...
- kafka实时流数据架构
初识kafka https://www.cnblogs.com/wenBlog/p/9550039.html 简介 Kafka经常用于实时流数据架构,用于提供实时分析.本篇将会简单介绍kafka以及它 ...
- 移植tslib库出现selected device is not a touchscreen I understand的解决方法
首发平台:微信公众号baiwenkeji 很多人在做触摸屏驱动实验,移植tslib库时,可能会出现错误提示“selected device is not a touchscreen I underst ...
- js获取动态日期时间
var timer=null; function tt(n){ if(n<10){ return '0'+n }else{ return n+'' } } timer=setInterval(f ...
- 关于HTTP请求中更改body中传递的参数方法
更改body中传递的参数方法: String txId = UUID.randomUUID().toString().replaceAll("-", ""); ...
- Know the Core Objects of Your App---了解应用程序的内核对象
Back to App Design You develop apps using the Cocoa application environment. Cocoa presents the app’ ...
- CoreBluetooth Central模式 Swift版
也是醉了,CB这个API到现在也没有Swift的文档.最新的文档还是3年前还是4年前的OC版的,被雷的外焦里嫩的.自己一点一点写成Swift还各种报错,最坑的是这些错误压根找不到解决方案.索性自己做个 ...