Skip to content
本页目录

事件流

事件发生的顺序

html
<div id="out">
  <p id="inner">click me!</p>
</div>
  • 假设给 p 和 div 标签都绑定了点击事件

事件捕获

从最外层开始发生, 直到具体的元素

触发的顺序为 document -> html -> body -> div -> p

事件冒泡

把一颗石头投入水中, 泡泡会一直从水底冒出水面

事件从最底层的元素开始发生, 一直向上传播, 直到 document 对象

触发的顺序为 p -> div -> body -> html -> document

EventTarget.addEventListener(event, fn, useCapture=false)

  • event 事件名
  • fn 回调函数
  • useCapture
    • true 事件句柄在捕获阶段执行
    • false 事件句柄在冒泡阶段执行

事件代理

利用事件冒泡的原理,只需给外层的父容器添加事件,内层的子元素有点击事件,则会冒泡到父容器上。子元素委托它的父元素执行事件。

html
<ul>
  <li>1</li>
  <li>2</li>
  <li>3</li>
  <li>4</li>
  <li>5</li>
</ul>
<script>
  const ul = document.querySelector("ul")
  ul.addEventListener('click', function (e) {
    console.log(e.target.innerHTML)
  }, false)
</script>

阻止

阻止事件传播(捕获|冒泡)

  • e.stopPropagation()
  • e.cancelBubble = true (ie)

阻止默认行为

  • e.preventDefault()
  • e.returnValue = false (ie)
  • @click.prevent = xxx (vue)

不支持冒泡的事件

妈妈不让我浪费

  • mouseenter
  • mouseleave
  • blur
  • resize
  • load
  • unload
  • focus