ASP源码.NET源码PHP源码JSP源码JAVA源码DELPHI源码PB源码VC源码VB源码Android源码
当前位置:首页 >> 低调看体育直播 >> Javascriptjrs看球网直播吧_低调看直播体育app软件下载_低调看体育直播 >> jQuery-191源码分析系列(十) 事件系统——事件体系结构

jQuery-191源码分析系列(十) 事件系统——事件体系结构(1/5)

来源:网络整理     时间:2015-11-18     关键词:队列,添加事件,jquery事件,计数器

本篇文章主要介绍了"jQuery-191源码分析系列(十) 事件系统——事件体系结构",主要涉及到队列,添加事件,jquery事件,计数器方面的内容,对于Javascriptjrs看球网直播吧_低调看直播体育app软件下载_低调看体育直播感兴趣的同学可以参考一下:   又是一个重磅功能点。  在分析源码之前分析一下体系结构,有助于源码理解。实际上在jQuery出现之前,Dean Edwards的跨浏览器AddEvent()...

  又是一个重磅功能点。

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

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


  源码解读

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

//事件添加方法function addEvent(element, type, handler) {
  //保证每个不同的事件响应函数只有唯一一个idif (!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 tableif (element.events && element.events[type]) {
        delete element.events[type][handler.$$guid];
    }
};

function handleEvent(event) {
  //兼容ie  event = event || window.event;
  //this是响应事件的节点,这个接点上有events属性(在addEvent中添加的)//获取节点对应事件响应函数列表var handlers = this.events[event.type];
    // 循环响应函数列表执行for (var i in handlers) {
         //保持正确的作用域,即this关键字this.$$handleEvent = handlers[i];
        this.$$handleEvent(event);
    }
};
View Code

重新梳理一下数据结构,使用一个例子

function f0(){...}
function f1(){...}
function f2(){...}
function f3(){...}
var dom = document.getElementById("chua");

addEvent(dom,"click",f1);
addEvent(dom,"change",f1);
addEvent(dom,"change",f2);
addEvent(dom,"click",f3);
addEvent(dom,"change",f3);

相关图片

相关文章