总结下js的DOM事件流

197 阅读2分钟

这是我参与8月更文挑战的第31天,活动详情查看:8月更文挑战

前言

在学了几天js的DOM事件后,咱们来学习下js的DOM事件流。

DOM事件流

我们给一个目标元素绑定点击事件,然后我们点击了这个元素,浏览器不会只响应这个元素的事件,因为你点击这个元素,等同于同时点击了该元素的祖先元素,所以就不只是响应目标元素的事件,如果这样,事件就会有先后的顺序。

历史上 网景公司推崇事件捕获,微软推崇事件冒泡。最后w3c统一了二者的想法。

先事件捕获,目标元素触发,后事件冒泡。

事件捕获

事件捕获,就是在目标元素触发事件之前,目标元素的祖先元素先把这个事件捕获触发,然后再响应到目标元素。

事件冒泡

事件冒泡,就是在目标元素触发事件之后,目标元素还会把事件往祖先元素上冒泡触发,直到最顶层。

总结就是三个阶段

  • 捕获阶段
  • 目标元素阶段
  • 冒泡阶段

Dom绑定事件

我们再来看看dom是怎么绑定事件?

第一种, DOM0级

<div>我是内容</div>
<script>
const div = document.querySelector('div')
 div.onclick = function () {
   // 触发的函数
 }
</script>

通过on + 事件名来绑定,这种绑定事件不能重复绑定,因为它只会响应一次。于是就有了DOM2级

第二种, DOM2级

<div>我是内容</div>
<script>
const div = document.querySelector('div')
 div.addEventListener('click', function () {
   // 触发的函数
 }) 
</script>

通过addEventListener来实现绑定事件,支持重复绑定。

dom.addEventListener(type, fn, options)

它有三个参数:

  • type:事件名,string类型,比如click,或者scroll等等。

  • fn: 事件触发时响应的函数

  • options: 支持传2种类型,如下

    • 布尔值:

      代表的是是否在捕获阶段响应。默认是false, 只会在冒泡阶段响应。true则代表只会在捕获阶段响应。

    • 对象

      • capture: 含义等同于上面的布尔值
      • once:布尔值,true表示fn只会触发一次。
      • passive: 布尔值,true表示fn内不会阻止默认事件。

例子

下面我们来看看DOM的事件流

  <style>
    .a-box {
      width: 200px;
      height: 200px;
      border: 1px solid red;
    }

    .b-box {
      margin: 20px;
      width: 100px;
      height: 100px;
      border: 1px solid blue;
    }
  </style>
  <div class="a-box">
    外盒子
    <div class="b-box">
      内盒子
    </div>
  </div>
  <script>
    const aBox = document.querySelector('.a-box')
    const bBox = document.querySelector('.b-box')
    aBox.addEventListener('click', function () {
      console.log('我是外盒子-捕获')
    }, true)
    bBox.addEventListener('click', function () {
      console.log('我是内盒子')
    })
    aBox.addEventListener('click', function () {
      console.log('我是外盒子-冒泡')
    }, false)
  </script>

image.png

总结

以上就是js的DOM事件流知识,大家可以动手敲敲代码,巩固一下。

感谢你们的阅读。