jQuery-1.9.1源码分析系列(十)事件系统之事件体系结构

jQuery-1.9.1源码分析系列(十)事件系统之事件体系结构

又是一个重磅功能点。

  在分析源码之前分析一下体系结构,有助于源码理解。实际上在jQuery出现之前,Dean Edwards的跨浏览器AddEvent()设计做的已经比较优秀了;而且jQuery事件系统的设计思想也是基于该思想的,所以我们先分析一下Dean Edwards前辈的事件绑定。

a. jQuery事件原型——Dean Edwards的跨浏览器AddEvent()设计

  源码解读

//事件添加方法
function addEvent(element, type, handler) {
  //保证每个不同的事件响应函数只有唯一一个id
if (!handler.$$guid) handler.$$guid = addEvent.guid ;
  // 给element维护一个events属性,初始化为一个空对象。
// element.events的结构类似于 { “click”: {…}, “dbclick”: {…}, “change”: {…} }
if (!element.events) element.events = {};
  // 试图取出element.events中当前事件类型type对应的对象(这个对象更像数组),赋值给handlers
  //如果element.events中没有当前事件类型type对应的对象则初始化
var handlers = element.events[type];
  if (!handlers) {
     handlers = element.events[type] = {};
     // 如果这个element已经有了一个对应的事件的响应方法,例如已经有了onclick方法
// 就把element的onclick方法赋值给handlers的0元素,此时handlers的结构就是:
// { 0: function(e){…} },这也是为什么addEvent.guid初始化为1的原因,预留看为0的空间;
// 此时element.events的结构就是: { “click”: { 0: function(e){…} }, /*省略其他事件类型*/ }
if (element[“on” type]) {
handlers[0] = element[“on” type];
}
}
  // 把当前的事件handler存放到handlers中,handler.$$guid = addEvent.guid ; addEvent.guid = 1; 肯定是从1开始累加的
  //因此,这是handlers的结构可能就是 { 0: function(e){…}, 1: function(){}, 2: function(){} 等等… }
handlers[handler.$$guid] = handler;
  //下文定义了一个handleEvent(event)函数,将这个函数,绑定到element的type事件上作为事件入口。
  //说明:在element进行click时,将会触发handleEvent函数,handleEvent函数将会查找element.events,并调用相应的函数。可以把handleEvent称为“主监听函数”
element[“on” type] = handleEvent;
};
//计数器
addEvent.guid = 1;
function removeEvent(element, type, handler) {
// delete the event handler from the hash table
if (element.events

© 版权声明

相关文章

暂无评论

none
暂无评论...