说一下事件委托
<ul id="ul"> <li>red</li> <li>yellow</li> <li>blue</li> <li>green</li> <li>black</li> <li>white</li> </ul>
常规方法:
var ul = document.getElementById('ul');
var lis = ul.getElementsByTagName('li');
for(let i in lis){
lis[i].addEventListener('click', showColor, false);
};
function showColor(e){
var x = e.target;
alert("The color is " + x.innerHTML);
}; 从代码中可以看出来,我们给每个 li 标签都加了功能基本相同的监听函数
事件代理:
var ul = document.getElementById('ul');
ul.addEventListener('click',showColor,false);
function showColor(e){
var x = e.target;
if(x.nodeName.toLowerCase() === 'li'){
alert('The color is ' + x.innerHTML);
}
} 将监听加在 li 的父元素 ul 标签中,在监听的回调函数中,通过 e.target 获取到真正被点击的子元素标签,然后打印这个子元素标签最中间的文本,也可以实现同样的效果。最大的优点就在于,我们只添加了一个监听,维护起来会十分的方便。并且,当我们需要通过 js 动态添加 li 时,新添加的 li 自动地地实现了上述方法。
网上有很多讲解,我也是悄悄做了做了一下总结,都来自前辈的经验:
<div id='outer'> <div id='inner'></div> </div>
let outer = document.getElementById('outer');
outer.addEventListener('click', function(e) {
console.log("e.target:",e.target.id);
console.log("e.currentTarget",e.currentTarget.id);
});