jQuery源碼探索之路(6)-- 事件綁定的不同

  1. 自己最近在學(xué)習(xí)一些JS插件的寫法载庭,那么當(dāng)然就繞不開jquery看彼,于是自己就邊學(xué)習(xí)邊模仿,寫一個(gè)自己的jQuery
  1. 自己也是在學(xué)習(xí)過程中囚聚,有問題請(qǐng)各位指出靖榕,希望大伙能多多支持,多點(diǎn)star
    顽铸,源碼github地址
jQuery源碼探索之路

.addEventListener(type , fn , false)

這是除了IE都支持的綁定事件的API茁计,這里不講兼容問題,主要是要看JQ內(nèi)部是如何綁定事件的谓松,后續(xù)還會(huì)寫JQ是如何實(shí)現(xiàn)事件代理的星压。
addEventListener具體解釋可以上MDN或W3C看,這里直接看怎么使用鬼譬。

首先娜膘,addEventListener是可以重復(fù)綁定的,而不會(huì)覆蓋拧簸,比如

綁定兩個(gè)
click后觸發(fā)

但是在JQ中劲绪,如果是要綁定多個(gè)function到同一個(gè)DOM上,就不是重復(fù)調(diào)用addEventListener了盆赤,而是使用一個(gè)數(shù)組去將這些fn緩存贾富,然后綁定一個(gè)主監(jiān)聽,在這個(gè)主監(jiān)聽fn中牺六,將數(shù)組里的fn一個(gè)個(gè)的倒出來調(diào)用颤枪。

上個(gè)代碼的例子你就明白了

var b2 = document.getElementById("box2");
var events = [];
for(var i = 0; i < 300; i++){
    events.push(function(){
        console.log("數(shù)組緩存fn");
    })
}
b2.addEventListener('click',function(e){
    var target = e.target;
    for(var i = 0; i < events.length; i++){
        events[i].call(target,e);
    }
})

當(dāng)在DOM上觸發(fā)事件后,會(huì)去執(zhí)行綁定的方法淑际,在這個(gè)主監(jiān)聽fn中有個(gè)for循環(huán)畏纲,將events數(shù)組中緩存的fn一個(gè)個(gè)的調(diào)用扇住。

使用call方法改變具體fn里的this指向的上下文。
將e作為參數(shù)傳遞給每個(gè)fn盗胀。

明白了這個(gè)艘蹋,JQ的事件模塊就能看懂了。

兩種方法的比較

我一直認(rèn)為后面這種方法只是是代碼看起來簡(jiǎn)單優(yōu)雅票灰,沒有那么多的重復(fù)內(nèi)容女阀,不明白性能上會(huì)不會(huì)有什么差異。
為了探索性能的差異屑迂,我寫了一段代碼粗糙的測(cè)試一下

//執(zhí)行綁定的開始時(shí)間戳和結(jié)束時(shí)間戳
    var start,end;
    //觸發(fā)事件浸策,執(zhí)行的開始時(shí)間戳和結(jié)束時(shí)間戳
    var addStart,addEnd;

    var b1 = document.getElementById('box1');
    var b2 = document.getElementById("box2");
    
    addStart = new Date().getTime();
    b1.addEventListener('click',function(e){
        start = new Date();
        console.log("開始執(zhí)行");
    },false)
    for(var i = 0; i < 3000; i++){
        b1.addEventListener('click',function(e){
            console.log("重復(fù)addEventListener綁定");
        });
    }
    b1.addEventListener('click',function(e){
        console.log("結(jié)束執(zhí)行")
        end = new Date();
        console.log("第一種方法執(zhí)行時(shí)間",end.getTime() - start.getTime());
    })
    addEnd = new Date().getTime();
    console.log('使用重復(fù)addEventListener綁定消耗事件:',addEnd - addStart);



    addStart = new Date().getTime();
    var events = [];
    for(var i = 0; i < 3000; i++){
        events.push(function(){
            console.log("使用數(shù)組緩存fn");
        })
    }
    b2.addEventListener('click',function(e){
        var target = e.target;
        start = new Date();
        for(var i = 0; i < events.length; i++){
            events[i].call(target,e);
        }
        end = new Date();
        console.log("使用數(shù)組執(zhí)行時(shí)間",end.getTime() - start.getTime());
    })
    addEnd = new Date().getTime();
    console.log("使用數(shù)組緩存消耗時(shí)間:",addEnd - addStart);

代碼里都有注釋,應(yīng)該看得懂惹盼,直接上測(cè)試結(jié)果

測(cè)試結(jié)果

可以看到在執(zhí)行綁定的時(shí)候庸汗,重復(fù)的使用addEventListener消耗的事件比使用數(shù)組push要慢得多。
而在觸發(fā)click事件執(zhí)行函數(shù)的時(shí)候手报,兩者的時(shí)間相差不大蚯舱。

我找不到瀏覽器內(nèi)部處理addEventListener API相關(guān)的解釋,猜測(cè)它應(yīng)該也是已數(shù)組的形式儲(chǔ)存同一個(gè)DOM的同一類型事件昧诱,所以兩者的時(shí)間才會(huì)差不多晓淀。

希望有知道具體解釋的朋友告訴我。

明白了兩者的不同盏档,后面簡(jiǎn)易的寫JQ的事件綁定方式就簡(jiǎn)單啦凶掰,敬請(qǐng)期待吧!


附:

既然您看都看完了蜈亩,麻煩您點(diǎn)個(gè)贊懦窘,給個(gè)star唄,謝謝您的支持V膳洹3┩俊!
源碼地址:https://github.com/LY550275752/my-js-plug/blob/master/Ye.js

如果您不知道我在說什么的話道川,推薦您從頭開始看我的這個(gè)系列文章:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末午衰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子冒萄,更是在濱河造成了極大的恐慌臊岸,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,029評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件尊流,死亡現(xiàn)場(chǎng)離奇詭異帅戒,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)崖技,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門逻住,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钟哥,“玉大人,你說我怎么就攤上這事瞎访∧宸。” “怎么了?”我有些...
    開封第一講書人閱讀 157,570評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵装诡,是天一觀的道長(zhǎng)银受。 經(jīng)常有香客問我践盼,道長(zhǎng)鸦采,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,535評(píng)論 1 284
  • 正文 為了忘掉前任咕幻,我火速辦了婚禮渔伯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘肄程。我一直安慰自己锣吼,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,650評(píng)論 6 386
  • 文/花漫 我一把揭開白布蓝厌。 她就那樣靜靜地躺著玄叠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拓提。 梳的紋絲不亂的頭發(fā)上读恃,一...
    開封第一講書人閱讀 49,850評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音代态,去河邊找鬼寺惫。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蹦疑,可吹牛的內(nèi)容都是我干的西雀。 我是一名探鬼主播,決...
    沈念sama閱讀 39,006評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼歉摧,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼艇肴!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起叁温,我...
    開封第一講書人閱讀 37,747評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤再悼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后券盅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體帮哈,經(jīng)...
    沈念sama閱讀 44,207評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,536評(píng)論 2 327
  • 正文 我和宋清朗相戀三年锰镀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了娘侍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咖刃。...
    茶點(diǎn)故事閱讀 38,683評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖憾筏,靈堂內(nèi)的尸體忽然破棺而出嚎杨,到底是詐尸還是另有隱情,我是刑警寧澤氧腰,帶...
    沈念sama閱讀 34,342評(píng)論 4 330
  • 正文 年R本政府宣布枫浙,位于F島的核電站,受9級(jí)特大地震影響古拴,放射性物質(zhì)發(fā)生泄漏箩帚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,964評(píng)論 3 315
  • 文/蒙蒙 一黄痪、第九天 我趴在偏房一處隱蔽的房頂上張望紧帕。 院中可真熱鬧,春花似錦桅打、人聲如沸是嗜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鹅搪。三九已至,卻和暖如春遭铺,著一層夾襖步出監(jiān)牢的瞬間丽柿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評(píng)論 1 266
  • 我被黑心中介騙來泰國打工掂僵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留航厚,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,401評(píng)論 2 360
  • 正文 我出身青樓锰蓬,卻偏偏與公主長(zhǎng)得像幔睬,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子芹扭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,566評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 1.JQuery 基礎(chǔ) 改變web開發(fā)人員創(chuàng)造搞交互性界面的方式麻顶。設(shè)計(jì)者無需花費(fèi)時(shí)間糾纏JS復(fù)雜的高級(jí)特性。 1....
    LaBaby_閱讀 1,330評(píng)論 0 2
  • 1.JQuery 基礎(chǔ) 改變web開發(fā)人員創(chuàng)造搞交互性界面的方式舱卡。設(shè)計(jì)者無需花費(fèi)時(shí)間糾纏JS復(fù)雜的高級(jí)特性辅肾。 1....
    LaBaby_閱讀 1,167評(píng)論 0 1
  • (續(xù)jQuery基礎(chǔ)(1)) 第5章 DOM節(jié)點(diǎn)的復(fù)制與替換 (1)DOM拷貝clone() 克隆節(jié)點(diǎn)是DOM的常...
    凜0_0閱讀 1,324評(píng)論 0 8
  • 昨天聽了逯薇老師的收納課。 逯薇老師把收納與她的建筑學(xué)背景聯(lián)系起來轮锥,整理出一套簡(jiǎn)單易懂的收納方法〗玫觯現(xiàn)在我把聽課筆記...
    小萌妮閱讀 2,186評(píng)論 0 5
  • “如果每天早下班一個(gè)小時(shí),人生進(jìn)程會(huì)不會(huì)提前一個(gè)小時(shí)?”伍佰問西貝新娜。 “你吃撐的沒事做吧赵辕,你想得都是啥啊概龄?”西貝嫌...
    人一一閱讀 132評(píng)論 0 0