Appearance
Event 
分配事件处理程序有三种方式
onclick="..." :HTML 特性,内联的方式,很少用
elem.onclick = function :DOM 属性,只能分配一个,单一程序很好用
addEventListener :最灵活的方式
addEventListener 
js
elem.addEventListener(event, handler)
elem.addEventListener('click', (event) => {
  let type = event.type
  let target = event.currentTarget
  console.log(`${type} at ${target}`)
})handleEvent 
将一个对象作为 handler 时,会调用该对象的 handleEvent 方法
js
let obj = {
  handleEvent(event) {
    let type = event.type
    let target = event.currentTarget
    console.log(`${type} at ${target}`)
  }
}
elem.addEventListener('click', obj)冒泡 
事件从目标元素,从下往上不断传递的过程
几乎所有事件都会冒泡
event.target :引发事件的元素,目标元素
event.currentTarget :处理事件的元素,绑定了处理程序的元素(this)
js
event.stopPropagation()捕获
从上往下的,与冒泡刚好相反的阶段
捕获阶段 => 目标阶段 => 冒泡阶段
