js事件委托

我們收取快遞有兩種方法:一是在特定的地點(diǎn)等快遞的到來饥臂,二是委托人代收⊙吩辏現(xiàn)實(shí)當(dāng)中,我們大都采用委托的方案隅熙。而委托人接受的委托不止一份稽煤,他會(huì)判斷收件人,從而發(fā)放到各自手中囚戚。這也就是js事件委托的通俗理解酵熙。

為啥要用事件委托?

一般來說驰坊,dom需要有事件處理程序匾二,我們都會(huì)直接給它設(shè)事件處理程序就好了,那為什么要用事件委托呢拳芙?
獨(dú)立典型的程序或許需要單獨(dú)的處理程序察藐,但是程序的結(jié)構(gòu)越復(fù)雜龐大,就會(huì)有大量重復(fù)的程序事件舟扎。單獨(dú)直接得處理程序分飞,會(huì)嚴(yán)重影響工作的效率《孟蓿可能譬猫,我們能用for循環(huán)等方法,遍歷所以程序邦泄,但這會(huì)導(dǎo)致與dom節(jié)點(diǎn)的不斷交互删窒,訪問dom的次數(shù)越多裂垦,引起瀏覽器重繪與重排的次數(shù)也就越多顺囊,就會(huì)延長(zhǎng)整個(gè)頁面的交互就緒時(shí)間,這就是為什么性能優(yōu)化的主要思想之一就是減少DOM操作的原因蕉拢。
所以如果要用事件委托特碳,就會(huì)將所有的操作放到j(luò)s程序里面,與dom的操作就只需要交互一次晕换,這樣就能大大的減少與dom的交互次數(shù)午乓,提高性能

如何實(shí)現(xiàn)事件委托?

事件委托是利用事件的冒泡原理來實(shí)現(xiàn)的事件從最深的節(jié)點(diǎn)開始闸准,然后逐步向上傳播至最上層的事件益愈。

網(wǎng)上常見的例子

 <ul id="ul">
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
    </ul>

我們需要把li的點(diǎn)擊事件綁定到ul上

var ul = document.getElementById('ul')
ul.addEventListener('click', function() {})

這樣我們就實(shí)現(xiàn)了委托,但是有出現(xiàn)了新的問題,如果ul內(nèi)不止li蒸其,那么處于ul內(nèi)的其他元素被點(diǎn)擊時(shí)敏释,事件也被觸發(fā)了!
所以我們需要在觸發(fā)事件前來一個(gè)判斷

ul.addEventListener('click', function(e) 
           // 檢查事件源e.targe是否為L(zhǎng)i
           if (e.target && e.target.nodeName.toUpperCase == "LI") {

            // 真正的處理過程在這里
            console.log("點(diǎn)擊成功")
          }
       }

這樣就大功告成了摸袁?很遺憾钥顽,這種情況還存在一個(gè)嚴(yán)重的bug,如果元素在li中呢靠汁?那么事件就不會(huì)觸發(fā)蜂大!比如這樣

<ul id="ul">
    <li id="l1"><span>1</span></li>
    <li id="l2">2</li>
    <li id="l3">3</li>
    <li id="l4">4</li>
</ul>

那么該怎么做呢?我們需要再加一個(gè)判斷蝶怔,判斷點(diǎn)擊的元素的父輩元素中有沒有l(wèi)i奶浦,如果有,就繼續(xù)執(zhí)行事件添谊。

ul.addEventListener('click', function() {
                    let el = e.target
                    while (el && !el.matches(selector)) {
                        el = el.parentNode
                        if (element === el) {
                            el = null
                        }
                    }
                    if (el) {
                        console.log('執(zhí)行回調(diào)函數(shù)')
                    }
                }

后記

我們發(fā)現(xiàn)問題财喳,然后找出方法解決問題。并不代表事件的結(jié)束斩狱,我們所用的方法也許會(huì)帶來其他的原題耳高。多思考,多測(cè)試所踊,不斷完善泌枪。記住,現(xiàn)在得到的永遠(yuǎn)不是最佳答案秕岛。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末碌燕,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子继薛,更是在濱河造成了極大的恐慌修壕,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件遏考,死亡現(xiàn)場(chǎng)離奇詭異慈鸠,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)灌具,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門青团,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人咖楣,你說我怎么就攤上這事督笆。” “怎么了诱贿?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵娃肿,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng)料扰,這世上最難降的妖魔是什么锨阿? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮记罚,結(jié)果婚禮上墅诡,老公的妹妹穿的比我還像新娘。我一直安慰自己桐智,他們只是感情好末早,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著说庭,像睡著了一般然磷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上刊驴,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天姿搜,我揣著相機(jī)與錄音,去河邊找鬼捆憎。 笑死舅柜,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的躲惰。 我是一名探鬼主播致份,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼础拨!你這毒婦竟也來了氮块?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤诡宗,失蹤者是張志新(化名)和其女友劉穎滔蝉,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體塔沃,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蝠引,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了芳悲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片立肘。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡边坤,死狀恐怖名扛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情茧痒,我是刑警寧澤肮韧,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響弄企,放射性物質(zhì)發(fā)生泄漏超燃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一拘领、第九天 我趴在偏房一處隱蔽的房頂上張望意乓。 院中可真熱鬧,春花似錦约素、人聲如沸届良。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽士葫。三九已至,卻和暖如春送悔,著一層夾襖步出監(jiān)牢的瞬間慢显,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工欠啤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留荚藻,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓洁段,卻偏偏與公主長(zhǎng)得像鞋喇,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子眉撵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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

  • 一直以來侦香,對(duì)js的一些概念還是不清晰的,很多都沒有搞明白纽疟,今天無意間在群里見他們提起事件委托罐韩,所以查找了一些資料,...
    蝴蝶結(jié)199007閱讀 282評(píng)論 1 3
  • 第一組:楊昊 真干貨——Js事件委托 一份好的代碼炎功,不僅僅要寫的美觀枚冗,還要性能卓越。事件委托可以說就是這樣一種—...
    胡諾閱讀 676評(píng)論 1 3
  • 定義:通俗的講蛇损,事件就是onclick赁温,onmouseover坛怪,onmouseout等就是事件,委托呢股囊,就是讓別人...
    JYOKETSU3閱讀 330評(píng)論 0 0
  • 本來打算介紹clipboard.js如何使用袜匿,卻發(fā)現(xiàn)在https://clipboardjs.com介紹中事件委托...
    最愛是荔枝閱讀 309評(píng)論 0 0
  • 前言 事件委托,也叫事件代理稚疹,是js事件中的一種常用技巧居灯。事件委托的原理就是利用冒泡事件的機(jī)制,為一些節(jié)點(diǎn)的祖先節(jié)...
    zkhChris閱讀 516評(píng)論 0 3