怎样写一个事件委托

    简单版本如下

    1. // HTML
    2. <ul id="xxx">
    3. <li>111</li>
    4. <li>222</li>
    5. <li>333</li>
    6. <li>444</li>
    7. </ul>
    1. // JS
    2. xxx.addEventListener('click',(e)=>{
    3. if(e.target.tagName.toLowerCase() ==='li'){
    4. console.log('我被点击了')
    5. }
    6. })

    这有一个弱点,该事件委托匹配的 DOM 的标签名字,如果 li 里面套有其他标签被点击时,这就无法被委托了,这不符合我们预期,所以有改进空间

    1. // HTML
    2. <ul id="xxx">
    3. <li>111</li>
    4. <li>222</li>
    5. <li>333</li>
    6. <li>444<span>我是 span 元素</span></li>
    7. </ul>
    1. xxx.addEventListener('click',(e)=>{
    2. let el = e.target
    3. while(el !== e.currentTarget){
    4. if(el.tagName.toLowerCase === 'li'){
    5. console.log('我被点击了')
    6. }
    7. el = el.parentNode
    8. }
    9. })

    利用冒泡原理,当点击 li 里面的标签时,在其中加一个判读,直到找到 li 为止,直到最顶层的 ul 结束

    「@浪里淘沙的小法师」