定义
- 通俗地讲,事件委托就是把一个元素的事件响应处理程序委托给另一个元素。
举个例子 🌰
HTML代码
<ul id="myLink"><li id="1">aaa</li><li id="2">bbb</li><li id="3">ccc</li></ul>
- 这里有一个无序列表,我们想给其中的每个
<li>标签都加上一个点击事件。 在不知道事件委托的情况下,最笨的方法就是用一个循环给每个
<li>标签都加上一个点击事件处理程序。不使用事件委托
// 不使用事件委托// 先找到所有<li>标签let myLink = document.getElementById('myLink');let li = myLink.getElementsByTagName('li');// 使用for循环给每个<li>标签都加上一个点击事件处理程序for(let i = 0; i < li.length; i++) {li[i].onclick = (e) => {let e = event || window.event;let target = e.target || e.srcElement;alert(e.target.id + ':' + e.target.innerText);};}
这样做存在很多问题:
当我们可以通过使用事件委托将事件委托给它的父级元素。
let myLink = document.getElementById('myLink');// 给父级元素添加一个点击事件处理程序myLink.onclick = (e) => {var e = event || window.event;var target = e.target || e.srcElement;// 使用target和nodeName来找到<li>标签,并设定点击事件仅对<li>生效if(e.target.nodeName.toLowerCase() == 'li') {alert(e.target.id + ':' + e.target.innerText);}};
优点
- 不需要给每一个元素都分配一个处理程序,减少内存空间占用;
- HTML结构非常灵活,方便动态元素的处理;
缺点
- 层级太多的话,事件冒泡可能会被某一层阻止。
