*說到事件委托,我們首先先要知道什么是事件委托——
? ? ?· 那么什么是事件委托呢?????
????????JS里的事件委托就是當(dāng)事件觸發(fā)時,把要做的事委托給父元素(上級、上上級......)來處理。當(dāng)需要添加的事件過多時,可以使用事件委托,而事件委托實際上利用了事件冒泡的特性。
? ? ?· 那可能會問了,什么是事件冒泡呢??
? ? ? ?簡單的來說,當(dāng)我們點擊子元素,觸發(fā)的時事件會傳遞給父元素,這就是事件冒泡。
? ? ?·?為什么要用事件委托呢?好處是啥?
? ??????????咱先說說好處是啥:
? ? ? ?因為在JavaScript中,每個函數(shù)都是對象,對象越多,占用的內(nèi)存也就越多,合理使用事件委托可以減少內(nèi)存的占用。所以事件委托的好處就是在內(nèi)存中開辟了一塊空間,節(jié)省資源同時減少了dom操作,提高性能,而且js新生成的子元素也不用新為其添加事件了,程序邏輯上比較方便
? ??????????那為啥要用時間委托呢?
????因為,每個事件處理函數(shù)都是對象,對象會占用內(nèi)存,內(nèi)存中的對象越多,性能就越差。
????此外,必須事先指定所有的事件處理程序而導(dǎo)致的DOM訪問次數(shù),會延遲整個頁面的交互就緒時間。
? ? ? ?· 好處說了,說說問題吧~
? ? ? ? ?兼容,一個好的項目,首先要考慮的就是兼容問題,事件委托存在兼容性問題是,在老的IE下,事件源是 window.event.srcElement,其他瀏覽器是 event.target,所以在做兼容的時候? 參數(shù) = event.target || window.event 需要加上這一步。完美解決~
? ? ? ?關(guān)于 Jquery事件委托在IOS系統(tǒng)會失效!?
????????將事件委托給了document元素,具體綁定情況如下:
????????$(document).on('click',?".btn",?function(){})
????????PC端測試和安卓測試都正常,但是在IOS端缺失效了!根據(jù)H5新定義,默認(rèn)可點擊的元素有a標(biāo)簽和button標(biāo)簽,也就是給這兩種標(biāo)簽進行事件委托是完全沒有問題的。
????????解決辦法:
????????給.btn加一個樣式: cursor: pointer;
????????按照規(guī)定, 點擊元素使用button或者a標(biāo)簽
????????把document換成.btn的父元素,前提是父元素不是跟隨.btn一起動態(tài)添加進來的
? ? ? ? 然后給一個比較簡單的問題,父級那么多子元素,怎么區(qū)分事件本應(yīng)該是哪個子元素的?
? ? ? ? 區(qū)分方法就是event對象里記錄的有“事件源”,它就是發(fā)生事件的子元素。
贈品:
事件捕獲和事件冒泡機制
事件捕獲
當(dāng)一個事件觸發(fā)后,從Window對象觸發(fā),不斷經(jīng)過下級節(jié)點,直到目標(biāo)節(jié)點。在事件到達目標(biāo)節(jié)點之前的過程就是捕獲階段。所有經(jīng)過的節(jié)點,都會觸發(fā)對應(yīng)的事件
事件冒泡
當(dāng)事件到達目標(biāo)節(jié)點后,會沿著捕獲階段的路線原路返回。同樣,所有經(jīng)過的節(jié)點,都會觸發(fā)對應(yīng)的事件

DOM事件流模型
????總共三階段
????????在DOM兼容瀏覽器中,事件流分為3個階段:
????????(1)捕獲階段:事件從Document節(jié)點自上而下向目標(biāo)節(jié)點傳播的階段;
????????(2)目標(biāo)階段:真正的目標(biāo)節(jié)點正在處理事件的階段;
????????(3)冒泡階段:事件從目標(biāo)節(jié)點自上而下向Document節(jié)點傳播的階段。?[3]
????獨特性質(zhì)
????????????DOM事件流最獨特的性質(zhì)是,文本節(jié)點也觸發(fā)事件(在IE中不會),當(dāng)鼠標(biāo)單擊“單擊此文本”文本時會觸發(fā)click事件,該事件的捕獲階段最先開始,從Document節(jié)點開始逐漸向下傳播,直到“單擊此文本”文本節(jié)點,事件進入目標(biāo)階段,在目標(biāo)階段結(jié)束之后,事件由“單擊此文本”文本節(jié)點開始事件的冒泡階段,直到Document節(jié)點為止。?
????????????另外,需要說明的是,有些事件是可以取消的,在整個事件流的任何位置通過調(diào)用事件的stopPropagation方法可以停止事件的傳播過程。?