web前端面試題@六(事件委托)

*說到事件委托,我們首先先要知道什么是事件委托——

? ? ?· 那么什么是事件委托呢?????

????????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方法可以停止事件的傳播過程。?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ??JavaScript 與 HTML 之間的交互是通過事件實現(xiàn)的。 ??事件,就是文檔或瀏覽器窗口中發(fā)生的一些特...
    霜天曉閱讀 3,684評論 1 11
  • JavaScript 與 HTML 之間的交互是通過事件實現(xiàn)的。事件,就是文檔或瀏覽器窗口中發(fā)生的一些特定的交互瞬...
    LemonnYan閱讀 737評論 0 4
  • js之事件機制 1、事件初探 1.1 js事件的概述 JavaScript事件:JavaScript是基于事件驅(qū)動...
    道無虛閱讀 2,630評論 0 2
  • 一、事件流 1.1 事件流 事件流:從頁面中接受事件的順序 事件冒泡:即事件開始時由最具體的元素(文檔中嵌套層次最...
    范小飯_閱讀 1,161評論 1 9
  • 第3章 基本概念 3.1 語法 3.2 關(guān)鍵字和保留字 3.3 變量 3.4 數(shù)據(jù)類型 5種簡單數(shù)據(jù)類型:Unde...
    RickCole閱讀 5,502評論 0 21

友情鏈接更多精彩內(nèi)容