摘要:開(kāi)玩笑啦,提供一種方法叫做事件委托。途中經(jīng)過(guò)各個(gè)層次的,并在各上觸發(fā)捕獲事件,直到到達(dá)時(shí)間的目標(biāo)。懂得了事件冒泡的過(guò)程,就很容易明白事件委托的運(yùn)作原理。
首先祝大家七夕快樂(lè)。。
假如現(xiàn)在有一個(gè)的列表,里面可能會(huì)有若干個(gè)列表項(xiàng)。現(xiàn)在要為每一個(gè)列表項(xiàng)綁定相同的點(diǎn)擊事件,現(xiàn)在你可能會(huì)有這幾種做法:
手動(dòng)為每一個(gè)列表項(xiàng)綁定事件;
在onload的時(shí)候,找到該列表,對(duì)其每一個(gè)子元素進(jìn)行遍歷,循環(huán)綁定事件;
給每一個(gè)列表項(xiàng)相同的類(lèi)名,一次性對(duì)其進(jìn)行綁定。
方法1: 對(duì)于5個(gè)以?xún)?nèi)的列表項(xiàng)還好,如果列表有很多,比如100+,那么這種方法很不現(xiàn)實(shí),代碼會(huì)非常多,而且難以維護(hù)。
方法2: 代碼量看上去應(yīng)該不多,但是同樣會(huì)難以維護(hù),如果是動(dòng)態(tài)生成的列表項(xiàng),很有可能會(huì)出現(xiàn)問(wèn)題。最重要的,如果有大量列表項(xiàng),性能會(huì)變得十分糟糕。
方法3: 原生JS不能直接選擇class就不說(shuō)了,即使通過(guò)匹配className的方法進(jìn)行綁定,其性能只會(huì)比方法2還要差。
綜上所述,JS完了(誤)。
開(kāi)玩笑啦,js提供一種方法叫做**事件委托**。
在講事件委托之前,我們不妨先了解一下事件的三個(gè)階段(對(duì)事件冒泡有所了解的可跳過(guò)此段):
捕獲階段——眾里尋他千百度:
事件從文檔根節(jié)點(diǎn)出發(fā),隨著DOM結(jié)構(gòu)向事件的目標(biāo)節(jié)點(diǎn)尋找。途中經(jīng)過(guò)各個(gè)層次的DOM node,并在各node上觸發(fā)捕獲事件,直到到達(dá)時(shí)間的目標(biāo)node。
目標(biāo)階段——終于等到你,還好我沒(méi)放棄:
事件到達(dá)目標(biāo)node,在目標(biāo)node上被觸發(fā)。
冒泡階段——山谷回音:
事件在目標(biāo)node上觸發(fā)后,將由DOM樹(shù)一層層向上冒泡,依次觸發(fā),直到到達(dá)最外層的根節(jié)點(diǎn)。這是時(shí)間委托所利用的特點(diǎn)。
請(qǐng)?jiān)徫矣眠@么文藝的方式給大家講述事件觸發(fā)的故事。O(∩_∩)O
懂得了事件冒泡的過(guò)程,就很容易明白事件委托的運(yùn)作原理。當(dāng)列表項(xiàng)的事件冒泡到父元素(即列表元素)時(shí),可以查看事件對(duì)象的target屬性,catch真正被點(diǎn)擊的節(jié)點(diǎn)元素。下面是一段簡(jiǎn)單代碼展示了這個(gè)過(guò)程:
document.getElementById("list").addEventListener("click",function(e) { if(e.target && e.target.nodeName == "LI") { //TO DO SOMETHING } });
解釋一下代碼: 獲得父級(jí)元素list,為其綁定點(diǎn)擊事件:如果子元素(列表項(xiàng))被點(diǎn)擊,當(dāng)事件冒泡到list時(shí),判斷目標(biāo)節(jié)點(diǎn)(事件來(lái)源)是否為li元素,如果是則觸發(fā)該事件。
日常的例子: 假如你是一位小學(xué)班主任,你制定了一個(gè)規(guī)則:如果班里有人早戀就必須受到懲罰(定義了事件觸發(fā)后執(zhí)行的函數(shù))。但是學(xué)生的活動(dòng)范圍是整個(gè)學(xué)校而不是局限于一個(gè)班,所以你就天天在學(xué)校里溜達(dá)(將事件綁定到父級(jí)元素)。突然看到有學(xué)生在接吻(事件句柄),你需要判斷這個(gè)學(xué)生是不是自己班里的,如果是,請(qǐng)暴揍他一頓(觸發(fā)事件,他還是個(gè)孩子,請(qǐng)不要放過(guò)他)。
當(dāng)然,在真正的實(shí)際應(yīng)用中也許沒(méi)有這么簡(jiǎn)單,你也許只需要其中部分子元素綁定事件;也許還要考慮瀏覽器兼容的問(wèn)題(在IE里目標(biāo)元素放在srcElement屬性中而不是target中,所以最好把獲得目標(biāo)元素寫(xiě)成一個(gè)跨瀏覽器的函數(shù))。不過(guò)無(wú)論如何,你不需要為不確定的DOM而經(jīng)常改變你的綁定,更不會(huì)因?yàn)檫^(guò)多的綁定導(dǎo)致性能的降低,大大降低崩潰的風(fēng)險(xiǎn)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/85911.html
摘要:所謂的事件委托,簡(jiǎn)單的來(lái)說(shuō)就是將一個(gè)元素響應(yīng)事件委托給另外一個(gè)元素。而正好瀏覽器當(dāng)中有事件冒泡機(jī)制,一張圖簡(jiǎn)單了解下瀏覽器的事件響應(yīng)機(jī)制。 適用場(chǎng)景 在日常開(kāi)發(fā)過(guò)程中,我們經(jīng)常會(huì)遇到這樣一種場(chǎng)景:我需要通過(guò)ajax從后端獲取數(shù)據(jù)后動(dòng)態(tài)添加dom節(jié)點(diǎn)來(lái)展示數(shù)據(jù),并且這些dom節(jié)點(diǎn)有時(shí)候又需要是可交互的,例如點(diǎn)擊事件。那么在我們獲取到數(shù)據(jù)之前這些dom節(jié)點(diǎn)是不存在的,也就是說(shuō)我們沒(méi)辦法在獲...
摘要:雪碧圖內(nèi)聯(lián)圖片將站內(nèi)小圖標(biāo)合并成一張圖,使用定位截取對(duì)應(yīng)圖標(biāo)適當(dāng)使用內(nèi)聯(lián)圖片。瀏覽器緩存合理設(shè)置瀏覽器緩存是網(wǎng)頁(yè)優(yōu)化的重要手段之一。為什么要減少請(qǐng)求在性能優(yōu)化中減少請(qǐng)求的措施占了很大部分,比如使用雪碧 這篇文章主要介紹了淺談網(wǎng)頁(yè)基本性能優(yōu)化規(guī)則小結(jié)的相關(guān)資料,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧 針對(duì)瀏覽器網(wǎng)頁(yè)的一些優(yōu)化規(guī)則 頁(yè)面優(yōu)化 靜態(tài)資源壓縮...
摘要:雪碧圖內(nèi)聯(lián)圖片將站內(nèi)小圖標(biāo)合并成一張圖,使用定位截取對(duì)應(yīng)圖標(biāo)適當(dāng)使用內(nèi)聯(lián)圖片。瀏覽器緩存合理設(shè)置瀏覽器緩存是網(wǎng)頁(yè)優(yōu)化的重要手段之一。為什么要減少請(qǐng)求在性能優(yōu)化中減少請(qǐng)求的措施占了很大部分,比如使用雪碧 這篇文章主要介紹了淺談網(wǎng)頁(yè)基本性能優(yōu)化規(guī)則小結(jié)的相關(guān)資料,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧 針對(duì)瀏覽器網(wǎng)頁(yè)的一些優(yōu)化規(guī)則 頁(yè)面優(yōu)化 靜態(tài)資源壓縮...
摘要:雪碧圖內(nèi)聯(lián)圖片將站內(nèi)小圖標(biāo)合并成一張圖,使用定位截取對(duì)應(yīng)圖標(biāo)適當(dāng)使用內(nèi)聯(lián)圖片。瀏覽器緩存合理設(shè)置瀏覽器緩存是網(wǎng)頁(yè)優(yōu)化的重要手段之一。為什么要減少請(qǐng)求在性能優(yōu)化中減少請(qǐng)求的措施占了很大部分,比如使用雪碧 這篇文章主要介紹了淺談網(wǎng)頁(yè)基本性能優(yōu)化規(guī)則小結(jié)的相關(guān)資料,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧 針對(duì)瀏覽器網(wǎng)頁(yè)的一些優(yōu)化規(guī)則 頁(yè)面優(yōu)化 靜態(tài)資源壓縮...
閱讀 2833·2021-10-13 09:48
閱讀 3805·2021-10-13 09:39
閱讀 3607·2021-09-22 16:04
閱讀 1842·2021-09-03 10:48
閱讀 850·2021-08-03 14:04
閱讀 2372·2019-08-29 15:18
閱讀 3413·2019-08-26 12:19
閱讀 2881·2019-08-26 12:08