国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網站 > WEB開發 > 正文

jQuery-1.9.1源碼分析系列(十)事件系統——事件體系結構

2024-04-27 15:02:34
字體:
來源:轉載
供稿:網友

  又是一個重磅功能點。

  在分析源碼之前分析一下體系結構,有助于源碼理解。實際上在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 && 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
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 孝感市| 阳山县| 卓资县| 凤阳县| 新和县| 奎屯市| 班玛县| 玉山县| 高陵县| 泸定县| 仪征市| 山丹县| 望奎县| 会宁县| 芦溪县| 建始县| 沙雅县| 越西县| 桓台县| 沈丘县| 林州市| 西峡县| 辽阳县| 新兴县| 富阳市| 陈巴尔虎旗| 博罗县| 闵行区| 布拖县| 同仁县| 六安市| 峨山| 定陶县| 峨山| 中卫市| 临江市| 蒙城县| 潞西市| 汝阳县| 金塔县| 龙游县|