JavaScript事件委托原理
一、什么是事件委托
事件委托也稱為事件代理。就是利用事件冒泡,把子元素的事件都綁定到父元素上。如果子元素阻止了事件冒泡,那么委托就無法實(shí)現(xiàn)。
舉個(gè)簡單的例子:
例如快遞員有100個(gè)快遞要分別送給100個(gè)學(xué)生, 如果一個(gè)個(gè)的送花費(fèi)時(shí)間較長。同時(shí)每個(gè)學(xué)生領(lǐng)取的時(shí)候,也需要排隊(duì)領(lǐng)取,也花費(fèi)時(shí)間較長,應(yīng)該怎樣操作呢?這時(shí)快遞員可以把100個(gè)快遞委托給班主任,班主任把這些快遞放到辦公室,同學(xué)們下課自行領(lǐng)取即可。這樣的話,快遞員省事,同學(xué)們領(lǐng)取也更方便。這個(gè)過程就是一個(gè)委托事件。
二、事件委托的原理
不是每個(gè)子節(jié)點(diǎn)單獨(dú)設(shè)置事件監(jiān)聽器,而是事件監(jiān)聽器設(shè)置在其父節(jié)點(diǎn)上,然后利用冒泡原理影響設(shè)置每個(gè)子節(jié)點(diǎn)。
我們?cè)賮砜纯丛诰唧w的程序中是如何實(shí)現(xiàn)的吧!
比如,我們現(xiàn)在有一個(gè)無序列表,在無序列表里面有五個(gè)li,我們想要給每個(gè)li添加一個(gè)點(diǎn)擊事件,這個(gè)時(shí)候,我們常規(guī)操作是通過循環(huán)給每個(gè)li添加點(diǎn)擊事件。
代碼如下所示:
<body> <ul> <li>111111</li> <li>222222</li> <li>333333</li> <li>444444</li> <li>555555</li> </ul> <script> var li = document.querySelectorAll('li'); for(var i=0;i<li.length;i++){ li[i].onclick = function(){ this.style.color = 'green'; } } </script> </body>
運(yùn)行結(jié)果為:
這種方法的確可以實(shí)現(xiàn)我們的點(diǎn)擊操作,但是這個(gè)過程中,由于每次都要給li添加點(diǎn)擊事件,造成訪問DOM的次數(shù)過多,會(huì)延長整個(gè)頁面的交互就緒時(shí)間。
所以,這里,我們就可以用到事件委托,即給ul注冊(cè)點(diǎn)擊事件,然后利用事件對(duì)象的 target 來找到當(dāng)前點(diǎn)擊的 li,因?yàn)辄c(diǎn)擊li,事件會(huì)冒泡到ul上,ul有注冊(cè)事件,就會(huì)觸發(fā)事件監(jiān)聽器。
實(shí)現(xiàn)代碼為:
<script> var ul = document.querySelector('ul'); ul.addEventListener('click',function(e){ e.target.style.color = 'orange'; }) </script>
運(yùn)行結(jié)果為:
成功顯示。
三、事件委托的作用
通過上面的操作,我們可以得到:在事件委托中,我們只操作一次 DOM ,大大的提高了程序的性能。
到此這篇關(guān)于JavaScript事件委托原理的文章就介紹到這了,更多相關(guān)JavaScript事件委托內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Thinkphp5微信小程序獲取用戶信息接口的實(shí)例詳解
這篇文章主要介紹了Thinkphp5微信小程序獲取用戶信息接口的實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-09-09JavaScript?Broadcast?Channel?API使用學(xué)習(xí)
這篇文章主要為大家介紹了JavaScript的api學(xué)習(xí)之Broadcast?Channel?API使用方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05WebAssembly增強(qiáng)前端應(yīng)用技巧詳解
這篇文章主要為大家介紹了WebAssembly增強(qiáng)前端應(yīng)用技巧示例詳解,<BR>有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02