事件流 - 事件委托

251 阅读1分钟

事件流 - 事件委托

解决新增的标签元素没有老事件的问题。
思路 为子盒子的父元素绑定事件,通过 冒泡。触发子盒子就会冒泡到父盒子。(子盒子设有的绑定事件也会触发这个事件)

<button>生成新的 li 标签</button>
<ul>
<li>我是原生土著li1</li>
<li>我是原生土著li2</li>
<li>我是原生土著li3</li>
</ul>
 li {
    list-style: none;
    font: 22px/34px "simsun";
    background-color: skyblue;
    margin: 3px;
    cursor: pointer;
    }
  .new-li {
      background-color: lightgreen;
  }
let btn = document.getElementsByTagName('button')[0]

let liArr = document.getElementsByTagName('li')

let ul = document.getElementsByTagName('ul')[0]

// 为 li 标签绑定事件
Array.from(liArr).forEach(item => {
  item.onclick = function() {
    alert(item.innerHTML)
  }
});

// 点击 button 创建 li 标签,并追加到 ul
btn.onclick = () => {
  let newLi = document.createElement('li')
  newLi.innerHTML = "我是外来的 li"
  newLi.className = 'new-li'
  ul.appendChild(newLi)
}

上面代码测试,新增的 li 标签,是没有事件的。

那么如何通过事件冒泡来实现呢?

// 点击 button 创建 li 标签,并追加到 ul
btn.onclick = () => {
  let newLi = document.createElement('li')
  newLi.innerHTML = "我是外来的 li"
  newLi.className = 'new-li'
  ul.appendChild(newLi)
}

ul.onclick = (event) => {
  var event = event || window.event
  let ele = event.target ? event.target : event.srcElement // 兼容写法
  if (ele.tagName === 'LI') {
    console.log('我是 li 标签');
  }
}

event.target:  事件引发者 (不一定是事件源);