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

首頁 > 編程 > JavaScript > 正文

javascript中傳統事件與現代事件

2019-11-20 12:12:04
字體:
來源:轉載
供稿:網友

大家都知道,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位,        }      }    }  }

以上所述就是本文的全部內容了,希望大家能夠喜歡。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 亳州市| 五华县| 乌苏市| 凤凰县| 阜新| 师宗县| 三台县| 沽源县| 苗栗市| 谢通门县| 沁水县| 颍上县| 镇宁| 胶州市| 无锡市| 广河县| 安平县| 通州市| 长岭县| 汕头市| 阜阳市| 保亭| 石屏县| 大渡口区| 朝阳市| 松桃| 青浦区| 云林县| 嘉鱼县| 通榆县| 怀远县| 尚义县| 靖江市| 丹棱县| 朝阳区| 社会| 芷江| 夹江县| 蓝田县| 叙永县| 加查县|