摘要:說明這篇文章說中的事件委托,這次先說一些比較基本的知識。第一段綁定了兩次事件,第二段綁定了一次事件也就是說,原來在上綁定的事件,現(xiàn)在委托在了父元素上,而在上只需要綁定一次就可以了。我們用事件委托的方式,再來改改。
說明
這篇文章說JavaScript中的事件委托,這次先說一些比較基本的知識。
事件委托 是什么先來看看事件委托的概念
事件委托就是利用事件冒泡,只指定一個(gè)事件處理程序,就可以管理某一類型的所有事件。
事件委托,你叫他 事件代理 也可以,都是一個(gè)意思。
事件:JavaScript 偵測到的行為就是事件,比如鼠標(biāo)點(diǎn)擊、某個(gè)鍵盤的鍵被按下、元素獲得焦點(diǎn)。
委托:就是把原來自己做的事,交給別人做。
要說事件委托的原理,我們應(yīng)該先明白事件冒泡
事件冒泡:從目標(biāo)元素出發(fā),向外層元素冒泡,最后到達(dá)頂層(window或document),依次執(zhí)行綁定在其上的事件。
我們來看段代碼
效果圖
從上面的圖中我們看見,當(dāng)點(diǎn)擊 藍(lán)色 p 元素時(shí),先觸發(fā)了 p 元素上綁定的事件,然后又觸發(fā)了 紅色 div 元素上綁定的事件,這就是事件冒泡了。
事件委托 的實(shí)現(xiàn)先來段代碼
我們用事件委托的方式改寫一下上面的代碼,不過在這之前,我們還要明白一下什么是 event 對象
任何事件觸發(fā)后將產(chǎn)生一個(gè)event對象
event對象記錄事件發(fā)生時(shí)的鼠標(biāo)位置、鍵盤按鍵狀態(tài)和 觸發(fā)對象等信息
一般情況下,綁定事件處理函數(shù)時(shí),event對象默認(rèn)以第一個(gè)參數(shù)方式傳入
event對象有許多的屬性,具體的可以到這里去看
http://www.w3school.com.cn/js...
如果用事件委托,那代碼就是這樣的
上面的代碼,應(yīng)該很容易看懂的,我們看看他們的區(qū)別
1、第一段代碼是在 每個(gè) li 上綁定事件,第二段只是在 li 的父元素 ul 上綁事件。
2、第一段綁定了兩次事件,第二段綁定了一次事件
也就是說,原來在 li 上綁定的事件,現(xiàn)在委托在了父元素 ul 上,而在 ul 上只需要綁定一次就可以了。
我們再來看另一種情況,當(dāng)元素最開始不存在時(shí),需要綁定事件,最先能想到會(huì)出現(xiàn)這種情況的場景就是,元素是通過發(fā)請求,獲取數(shù)據(jù)后,拼接到頁面上的。而這種元素如果在發(fā)請求之前就綁定事件,是不會(huì)生效的。
上面這段代碼中,在元素 li3 還不存在的時(shí)候就綁定事件了,所以執(zhí)行代碼后就會(huì)報(bào)錯(cuò)
解決這個(gè)問題最直接的辦法就是等元素添加到頁面上之后,再綁定事件,我們來改改代碼。
改成這樣后,綁定事件就可以起作用了,但是這樣如果元素改變多次,就要元素渲染一次,就綁定一次事件,顯然是有點(diǎn)麻煩了。
我們用事件委托的方式,再來改改。
上面這段代碼,我們用事件委托的方式,并不在生成的元素上綁定事件,而是在生成元素的父元素上綁定事件,因?yàn)楦冈厥且恢贝嬖诘模越壎ǖ氖录涂梢陨А?/p> 事件委托 的好處
1、減少了事件監(jiān)聽器,原來需要在多個(gè)子元素綁定相同的事件處理函數(shù),現(xiàn)在只需要在祖先元素(一般為父元素)上統(tǒng)一定義一次即可。
2、減少內(nèi)存消耗,提高了頁面性能,這主要還是減少了事件處理函數(shù)的數(shù)量
3、動(dòng)態(tài)綁定事件,比如我們需要增加一個(gè)元素,那么我們還需要重新給這個(gè)元素綁定事件,但是用事件委托就沒關(guān)系了,因?yàn)槭录?不是 綁定在目標(biāo)元素上的,而是綁定在已經(jīng)存在于頁面上的父元素,冒泡到父元素上時(shí),執(zhí)行綁定在父元素上的事件處理函數(shù),這樣能減少很多不必要的工作。
事件委托 的局限focus、blur 之類的事件本身沒有事件冒泡機(jī)制,所以無法委托;
mousemove、mouseout 這樣的事件,雖然有事件冒泡,但是每次都要計(jì)算它的位置,對性能消耗高,而且很麻煩,因此也是不適合用事件委托。
這篇文章是比較基礎(chǔ)的,還有一些東西沒有說,比如文中說 事件委托的實(shí)現(xiàn) 的時(shí)候,舉的例子比較簡單,監(jiān)聽的 li 里面沒有子元素,如果存在子元素時(shí),那點(diǎn)擊子元素 又會(huì)有什么問題呢? 還有 JQuery中的事件委托 又是怎么做的呢? 看這里
簡單說 JavaScript中的事件委托(下)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/90505.html
摘要:說明這篇文章說中的事件委托,這次先說一些比較基本的知識。第一段綁定了兩次事件,第二段綁定了一次事件也就是說,原來在上綁定的事件,現(xiàn)在委托在了父元素上,而在上只需要綁定一次就可以了。我們用事件委托的方式,再來改改。 說明 這篇文章說JavaScript中的事件委托,這次先說一些比較基本的知識。 事件委托 是什么 先來看看事件委托的概念 事件委托就是利用事件冒泡,只指定一個(gè)事件處理程序,就...
摘要:說明上次我們說了一些,關(guān)于中事件委托的基礎(chǔ)知識,這次我們繼續(xù)來看。可選類型,一個(gè)選擇器,用于指定哪些后代元素可以觸發(fā)綁定的事件。類型,指定的事件處理函數(shù)。 說明 上次我們說了一些,關(guān)于 JavaScript中事件委托的 基礎(chǔ)知識,這次我們繼續(xù)來看。 解釋 先來一段代碼 1 2 ul.onclick...
摘要:說明上次我們說了一些,關(guān)于中事件委托的基礎(chǔ)知識,這次我們繼續(xù)來看。可選類型,一個(gè)選擇器,用于指定哪些后代元素可以觸發(fā)綁定的事件。類型,指定的事件處理函數(shù)。 說明 上次我們說了一些,關(guān)于 JavaScript中事件委托的 基礎(chǔ)知識,這次我們繼續(xù)來看。 解釋 先來一段代碼 1 2 ul.onclick...
閱讀 1530·2023-04-26 02:03
閱讀 4717·2021-11-22 13:53
閱讀 4593·2021-09-09 11:40
閱讀 3789·2021-09-09 09:34
閱讀 2129·2019-08-30 13:18
閱讀 3505·2019-08-30 11:25
閱讀 3301·2019-08-26 14:06
閱讀 2548·2019-08-26 13:52