JavaScript學(xué)習(xí)筆記——事件流和事件委托

一韧拒、事件流

1淹接、事件冒泡

IE事件流被稱為事件冒泡。例如在div元素中觸發(fā)click事件叛溢,其click事件會(huì)沿著DOM數(shù)一路向上塑悼,在經(jīng)過的每個(gè)節(jié)點(diǎn)上依次觸發(fā)直到documen對象。現(xiàn)代瀏覽器中的事件會(huì)一直冒泡到window對象楷掉,如圖所示厢蒜。

image

2、事件捕獲

Netscape Communication團(tuán)隊(duì)提出了事件捕獲的事件流烹植。而事件捕獲中斑鸦,同事件冒泡流區(qū)別在于其click事件是由document元素捕獲,然后沿DOM樹依次向下傳播直達(dá)目標(biāo)元素div草雕,如圖所示鄙才。

image

3、DOM事件流

按照規(guī)范事件流分為三個(gè)階段:事件捕獲促绵,達(dá)到目標(biāo)和事件冒泡。
1、事件捕獲:當(dāng)某個(gè)元素觸發(fā)某個(gè)事件败晴,頂層對象document就會(huì)發(fā)出一個(gè)事件流浓冒,隨著dom樹的節(jié)點(diǎn)向目標(biāo)元素節(jié)點(diǎn)流去,直到到達(dá)事件真正發(fā)生的目標(biāo)元素尖坤,在這個(gè)過程中稳懒,事件相應(yīng)的監(jiān)聽函數(shù)是不會(huì)被觸發(fā)的
2、事件目標(biāo):當(dāng)?shù)竭_(dá)目標(biāo)元素之后慢味,執(zhí)行目標(biāo)元素該事件相應(yīng)的處理函數(shù)场梆,如果沒有綁定監(jiān)聽函數(shù),那就不執(zhí)行
3纯路、事件冒泡:從目標(biāo)元素開始或油,往頂層元素傳播,途中如果有節(jié)點(diǎn)綁定了相應(yīng)的事件處理函數(shù)驰唬,這些函數(shù)都會(huì)被一次觸發(fā)顶岸,如果想阻止事件冒泡,可以使用event.stopPropgation()或者event.cancelBubble=true來阻止事件的冒泡傳播

image

4叫编、事件流的阻止


stopPropagation()

//既可以阻止事件冒泡辖佣,也可以阻止事件捕獲,也可以阻止處于目標(biāo)階段

stopImmediatePropagation()

//既可以阻止事件冒泡搓逾,也可以阻止事件捕獲卷谈,還會(huì)阻止該元素其他事件的發(fā)生

二、事件綁定和解綁

1霞篡、事件綁定

a世蔗、html中直接綁定——html中綁定事件叫做內(nèi)聯(lián)綁定事件,不利于分離

b寇损、js中直接綁定——js中直接綁定稱為賦值綁定函數(shù)凸郑,缺點(diǎn)是只能綁定一次

//事件監(jiān)聽,綁定
target.addEventListener(type, listener[, useCapture])

參數(shù)說明:

1矛市、target表示要監(jiān)聽事件的目標(biāo)對象芙沥,可以是一個(gè)文檔上的元素DOM本身,Window或者XMLHttpRequest

2浊吏、type表示事件類型的字符串

listener為當(dāng)指定的事件類型發(fā)生時(shí)被通知到的一個(gè)對象

useCapture為設(shè)置事件的捕獲或者冒泡

true為捕獲而昨,false為冒泡(默認(rèn))

3、addEventListener可以給同一個(gè)dom元素綁定多個(gè)函數(shù)找田,并且執(zhí)行順序按照綁定順序執(zhí)行歌憨,且執(zhí)行順序與useCapture無關(guān)

4、給一個(gè)dom元素綁定同一個(gè)函數(shù)墩衙,最多只能綁定useCapture類型不同的兩次

5务嫡、addEventListener只支持到IE9甲抖,為兼容性考慮,在兼容IE8及一下瀏覽器可以用attachEvent函數(shù)心铃,和addEventListener函數(shù)表現(xiàn)一樣准谚,但它綁定函數(shù)的this會(huì)指向全局

2、事件解綁

a去扣、通過dom的on***屬性設(shè)置的事件柱衔,可以用dom.onclick = null來解綁

b、通過addEventListener綁定的事件可以使用removeEventListener來解綁愉棱,接受參數(shù)一樣

c唆铐、對于使用removeEventListener函數(shù)解綁事件,需要傳入的listener奔滑,useCapture和addEventListener完全一致才可以解綁事件

三艾岂、事件委托和事件代理

1、事件委托和事件代理的理解

什么是事件委托档押?它還有一個(gè)名字叫事件代理澳盐,JavaScript高級程序設(shè)計(jì)上講:事件委托就是利用事件冒泡,只指定一個(gè)事件處理程序令宿,就可以管理某一類型的所有事件叼耙,當(dāng)我們需要對很多元素添加事件的時(shí)候,可以通過事件添加到他們的父節(jié)點(diǎn)二將時(shí)間委托給父節(jié)點(diǎn)來觸發(fā)處理函數(shù)粒没。

2筛婉、使用事件委托的優(yōu)點(diǎn)

一般來說,dom需要有事件處理程序癞松,我們都會(huì)直接給它設(shè)置事件處理程序就好了爽撒,那如果是很多的dom需要添加事件處理呢?比如我們這里有100個(gè)li响蓉,每個(gè)li都有相同的click事件硕勿,那么我們會(huì)用for循環(huán)的方法來遍歷所有的li,然后給他們添加事件枫甲,那么這樣會(huì)存在什么問題呢源武?

在JavaScript中,添加到頁面上的事件處理程序的數(shù)量將直接關(guān)聯(lián)到頁面整體的運(yùn)行性能想幻,因?yàn)樾枰粩嗟呐cdom節(jié)點(diǎn)進(jìn)行交互粱栖,訪問dom的次數(shù)越多,引起瀏覽器重繪與重排的次數(shù)就越多脏毯,就會(huì)延長整個(gè)頁面交互就緒時(shí)間闹究,這就是為什么性能優(yōu)化的主要思想是減少dom操作的原因,如果使用事件委托食店,就會(huì)將所有的操作放到j(luò)s程序里面渣淤,與dom的操作就只需要交互一次赏寇,這樣就能大大的減少與dom的交互次數(shù),提高性能砂代。

每個(gè)函數(shù)都是一個(gè)對象蹋订,是對象就會(huì)占用內(nèi)存,內(nèi)存占用率就越大刻伊,自然性能就差了,比如上面的100個(gè)li椒功,就要占用100個(gè)內(nèi)存空間捶箱,如果是1000個(gè),10000個(gè)呢动漾,如果使用事件委托丁屎,那么我們就可以只對它的父級這一個(gè)對象(如果只有一個(gè)父級)進(jìn)行操作,這樣我們就需要一個(gè)內(nèi)存空間就夠了旱眯,是不是省了很多晨川,自然性能就會(huì)更好。

3删豺、事件委托的原理實(shí)現(xiàn)

事件委托是利用事件的冒泡機(jī)制來實(shí)現(xiàn)的共虑,Event對象提供了一個(gè)屬性叫target,可以返回事件的目標(biāo)節(jié)點(diǎn)呀页,我們稱為事件源妈拌,也就是說,target就可以表示為當(dāng)前事件操作的dom蓬蝶,但是不是真正操作的dom尘分。標(biāo)準(zhǔn)瀏覽器用event.target,此時(shí)知識獲取了當(dāng)前節(jié)點(diǎn)的位置丸氛,并不知道是什么節(jié)點(diǎn)名稱培愁,這里我們用nodeName來獲取具體是什么標(biāo)簽名,這個(gè)返回的是一個(gè)大寫的缓窜,一般轉(zhuǎn)化為小寫再進(jìn)行比較

如果你想將事件委托給父元素來處理定续,但每個(gè)子元素的事件內(nèi)容又不相同時(shí),這里我們可以給每個(gè)子元素添加一個(gè)唯一的key來作標(biāo)識雹洗,然后在父元素中對其進(jìn)行分別的處理香罐,例如:


const list = document.querySelector('#list)

const lists = list.querySelector('#list > li')for(let i=0; i<lists.length; i++){

    lists[i].dataset.key = 'list-' + i

}

list.addEventListener('click',function(e){

    const event = e || window.event

    const target = event.target || event.srcElement 

    if(target.nodeName.toLocaleLowerCase() === 'li'){

        switch(target.dataset.key){

            case 'list-1':

                do something-1

                break            
            case 'list-2':

                do something-2

                break           

            default:

                do something-3

                break        }

    }

}) 

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市时肿,隨后出現(xiàn)的幾起案子庇茫,更是在濱河造成了極大的恐慌,老刑警劉巖螃成,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件旦签,死亡現(xiàn)場離奇詭異查坪,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)宁炫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門偿曙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人羔巢,你說我怎么就攤上這事望忆。” “怎么了竿秆?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵启摄,是天一觀的道長。 經(jīng)常有香客問我幽钢,道長歉备,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任匪燕,我火速辦了婚禮蕾羊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘帽驯。我一直安慰自己龟再,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布界拦。 她就那樣靜靜地躺著吸申,像睡著了一般。 火紅的嫁衣襯著肌膚如雪享甸。 梳的紋絲不亂的頭發(fā)上截碴,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機(jī)與錄音蛉威,去河邊找鬼日丹。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蚯嫌,可吹牛的內(nèi)容都是我干的哲虾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼择示,長吁一口氣:“原來是場噩夢啊……” “哼束凑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起栅盲,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤汪诉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扒寄,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鱼鼓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了该编。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片迄本。...
    茶點(diǎn)故事閱讀 39,779評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖课竣,靈堂內(nèi)的尸體忽然破棺而出嘉赎,到底是詐尸還是另有隱情,我是刑警寧澤于樟,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布曹阔,位于F島的核電站,受9級特大地震影響隔披,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜寂拆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一奢米、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧纠永,春花似錦鬓长、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至炭序,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間惭聂,已是汗流浹背窗声。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留辜纲,地道東北人笨觅。 一個(gè)月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像耕腾,于是被迫代替她去往敵國和親见剩。 傳聞我的和親對象是個(gè)殘疾皇子阅仔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評論 2 354

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