弄懂事件委託
- 2019 年 12 月 5 日
- 筆記
事件委託,也叫事件委派,事件代理。
當構建應用程式時,有時需要將事件監聽器綁定到頁面上的某些元素上,以便在用戶與元素交互時執行某些操作。
假設我們現在有一個無序列表:
<ul id="todo-app"> <li class="item">Walk the dog</li> <li class="item">Pay bills</li> <li class="item">Make dinner</li> <li class="item">Code for one hour</li> </ul>
我們需要在 <li>
上綁定點擊事件,我們可能會這樣操作:
app = document.getElementById('todo-app'); let items = app.getElementsByClassName('item'); // 將事件偵聽器綁定到每個列表項 for (let item of items) { item.addEventListener('click', function() { alert('you clicked on item: ' + item.innerHTML); }); }
雖然這樣可以實現功能,但問題是要單獨將事件偵聽器綁定到每個列表項。這是4個元素,沒什麼大問題,但如果列表中有10,000個事項,怎麼辦?這個函數將會創建10,000個獨立的事件監聽器,並將每個事件監聽器綁定到 DOM 。這樣程式碼執行的效率非常低下。
更高效的解決方案是將一個事件偵聽器實際綁定到父容器 <ul>
上,然後在實際單擊時可以訪問每個確切元素。這被稱為事件委託,並且它比每個元素單獨綁定事件的處理程式更高效。
那麼上面的程式碼可以改變為:
let app = document.getElementById('todo-app'); // 事件偵聽器綁定到整個容器上 app.addEventListener('click', function(e) { if (e.target && e.target.nodeName === 'LI') { let item = e.target; alert('you clicked on item: ' + item.innerHTML); } });