jQuery早期的事件系统,主要借鉴自Dean-Edward的事件模型。虽说早期的该事件模型也有些许bug,诸如:

  1,绑定的事件及其处理程序等数据并未存储到缓存中,而是直接存储在dom元素上,这样不仅污染了dom元素,而且还有可能造成隐患,比如在早期的ie下

  拷贝元素,顺带着连这些数据都拷贝了,有可能发生交错引用进而引起内存泄露;

  2,对待所有浏览器一视同仁,不论ie系还是现代浏览器,都统一采用 on+type的dom0级事件处理,这样失去了现代浏览器对事件冒泡或者捕获的控制,丧

  失了灵活性。

但是DE事件模型,的确解决了浏览器的兼容问题,特别是IE下attachEvent绑定事件处理函数,在执行回调函数时无序执行的问题,也解决了在回调函数中this指向

的问题,顺带着对event参数做了简单的修补,这种无侵入式的模型在当时都是首屈一指的。

现在自己贴出根据DE模型,自己修改后的事件系统:

addEvent.guid = 1;
addEvent.events = {}; //简单缓存系统
function addEvent(el,type,fn){
if(!fn.$$guid){
fn.$$guid = addEvent.guid++;
}
if(!el.$$guid){
el.$$guid = addEvent.guid++;
}
if(!addEvent.events[el.$$guid]){
addEvent.events[el.$$guid] = {};
}
var fns = addEvent.events[el.$$guid][type];
if(!fns){
fns = addEvent.events[el.$$guid][type] = {};
// 若在html行内绑定事件,则首先执行
if(el['on'+type]){
fns[0] = el['on'+type];
}
}
fns[fn.$$guid] = fn;
el['on'+type] = handleEvent;
} function deleteEvent(el,type,fn){
if(fn.$$guid in addEvent.events[el.$$guid][type]){
delete addEvent.events[el.$$guid][type][fn.$$guid];
}
} function handleEvent(event){
// 修正跨iframe获取不到event的bug
event = event || fixEvent(((this.ownerDocument || document || this).parentWindow || window).event);
var type = event.type,returnValue = true,
handlers = addEvent.events[this.$$guid][type];
for(var i in handlers){
if(handlers[i].call(this,event) === false){
returnValue = false;
}
}
return returnValue;
} function fixEvent(event) { event.preventDefault = function(){return event.returnValue = false;};
event.stopPropagation = function(){return event.cancelBubble = true;};
return event;
}

最新文章

  1. 利用jquery.validate以及bootstrap的tooltip开发气泡式的表单校验组件
  2. 走进AngularJs(五)自定义指令----(下)
  3. Caused by: java.lang.OutOfMemoryError: PermGen space.
  4. WCF之服务说明
  5. 小程序开发 easy-less 配置
  6. python练习题-day24
  7. Data_Structure01-绪论
  8. C# Note25: .Net Core
  9. postman 介绍
  10. vue2中使用transition
  11. Unity中实现人物平滑转身
  12. [转帖]super-inspire
  13. STL基础--基本介绍
  14. Python之路(第十九篇)hashlib模块
  15. Spring Boot (十五): Spring Boot + Jpa + Thymeleaf 增删改查示例
  16. [leetcode]Gray Code @ Python
  17. cut的用法【转】
  18. table表单制作个人简历
  19. springboot2.0 fastjson 日期格式化不生效解决
  20. Mac环境下Android Studio配置Git以及最基本使用

热门文章

  1. HTML5开发手机应用--viewport的作用
  2. Centos 6.5 搭建l2tp 服务端和客户端
  3. return array 评论添加状态和提示信息
  4. Redis系列(四)-低成本高可用方案设计
  5. MySQL KEY分区
  6. shell日常案例(一)
  7. Self Host模式下的ASP. NET Web API是如何进行请求的监听与处理的?
  8. [ASP.NET MVC 小牛之路]18 - Web API
  9. 《Entity Framework 6 Recipes》翻译系列 (5) -----第二章 实体数据建模基础之有载荷和无载荷的多对多关系建模
  10. 《Entity Framework 6 Recipes》中文翻译系列 (18) -----第三章 查询之结果集扁平化和多属性分组