事件順序
先執(zhí)行捕獲事件峻呛,然后目標(biāo)階段糟袁,再執(zhí)行冒泡事件
addEventlistener('',fn,false);//冒泡事件,默認(rèn)是冒泡
addEventlistener('',fn,true);//捕獲事件
給一個(gè)dom即綁定了捕獲伶棒,又綁定了冒泡旺垒,那么先綁定什么事件,就先執(zhí)行什么肤无。
事件代理
代理的意思就是只監(jiān)聽父節(jié)點(diǎn)的事件觸發(fā)先蒋,用來代理對(duì)其后代節(jié)點(diǎn)的監(jiān)聽,而你需要做的只是通過currentTarget
和target
屬性得到事件綁定的dom和事件觸發(fā)的dom宛渐,并作出回應(yīng)竞漾。
使用事件代理意味著你可以節(jié)省大量重復(fù)的事件監(jiān)聽,以減少瀏覽器資源消耗窥翩。當(dāng)你需要給動(dòng)態(tài)生成的dom綁定監(jiān)聽事件的時(shí)候业岁,就可以通過事件代理。
常用事件
-
load
資源加載完成時(shí)觸發(fā)寇蚊。這個(gè)資源可以是圖片笔时、CSS 文件、JS 文件仗岸、視頻允耿、document 和 window 等等。 -
DOMContentLoaded
DOM構(gòu)建完畢的時(shí)候觸發(fā), jQuery的ready方法包裹的就是這個(gè)事件扒怖。 -
beforeunload
當(dāng)用戶準(zhǔn)備離開這個(gè)頁面的時(shí)候觸發(fā)较锡,用戶點(diǎn)擊關(guān)閉頁面或者進(jìn)行其他關(guān)閉頁面的操作。 -
resize
當(dāng)節(jié)點(diǎn)尺寸發(fā)生變化時(shí)姚垃,觸發(fā)這個(gè)事件念链。通常用在 window 上,這樣可以監(jiān)聽瀏覽器窗口的變化。出于對(duì)性能的考慮掂墓,你可以使用函數(shù) throttle 或者 debounce 技巧來進(jìn)行優(yōu)化谦纱,throttle 方法大體思路就是在某一段時(shí)間內(nèi)無論多次調(diào)用,只執(zhí)行一次函數(shù)君编,到達(dá)時(shí)間就執(zhí)行跨嘉;debounce 方法大體思路就是在某一段時(shí)間內(nèi)等待是否還會(huì)重復(fù)調(diào)用,如果不會(huì)再調(diào)用吃嘿,就執(zhí)行函數(shù)祠乃,如果還有重復(fù)調(diào)用,則不執(zhí)行繼續(xù)等待兑燥。 -
error
當(dāng)我們加載資源失敗或者加載成功但是只加載一部分而無法使用時(shí)亮瓷,就會(huì)觸發(fā) error 事件,我們可以通過監(jiān)聽該事件來提示一個(gè)友好的報(bào)錯(cuò)或者進(jìn)行錯(cuò)誤上報(bào)服務(wù)器等其他處理降瞳。比如 JS 資源加載失敗嘱支,則提示嘗試刷新;圖片資源加載失敗挣饥,在圖片下面提示圖片加載失敗等除师。該事件不會(huì)冒泡。因?yàn)樽庸?jié)點(diǎn)加載失敗扔枫,并不意味著父節(jié)點(diǎn)加載失敗汛聚,所以你的處理函數(shù)必須精確綁定到目標(biāo)節(jié)點(diǎn)。一般綁定在window上