IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> DOM事件流与事件委托 -> 正文阅读

[JavaScript知识库]DOM事件流与事件委托

事件流

事件流描述的是从页面中接收事件的顺序。
事件发生时会在元素节点之间按照特定的顺序传播,这个传播过程即DOM事件流。

在这里插入图片描述
DOM事件流分为3个阶段

  • 捕获阶段
  • 当前目标阶段
  • 冒泡阶段

事件冒泡

IE最早提出,事件开始时由最具体的元素接收,然后逐级向上传播到到DOM最顶层节点的过程。

<div id="first">
  <div id="second">
    <div id="third"></div>
  </div>
</div>
#first {
  width: 200px;
  height: 200px;
  margin: 0 auto;
  background: red;
  border: 1px solid #ccc;
}
#second {
  width: 150px;
  height: 150px;
  margin: 24px auto;
  background: yellow;
  border: 1px solid #ccc;
}
#third {
  width: 100px;
  height: 100px;
  margin: 24px auto;
  background: blue;
  border: 1px solid #ccc;
}

addEventListener第三个参数是false那么则处于冒泡阶段,不写则默认为false

first.addEventListener('click', function () {
  console.log('红色');
});
second.addEventListener('click', function () {
  console.log('黄色');
});
third.addEventListener('click', function () {
  console.log('蓝色');
});

在这里插入图片描述

事件捕获

网景最早提出,由DOM最顶层节点开始,然后逐级向下传播到到最具体的元素接收的过程。

first.addEventListener('click', function () {
  console.log('红色');
},true);
second.addEventListener('click', function () {
  console.log('黄色');
},true);
third.addEventListener('click', function () {
  console.log('蓝色');
},true);

addEventListener第三个参数是true那么则处于捕获阶段。

在这里插入图片描述

事件在不同阶段执行

first.addEventListener('click', function () {
  console.log('红色');
});
second.addEventListener('click', function () {
  console.log('黄色');
},true);
third.addEventListener('click', function () {
  console.log('蓝色');
});

在这里插入图片描述
JavaScript代码中只能执行捕获或者冒泡其中的一个阶段,我们可以这么来理解:

  • 此处单击蓝色框后,事件捕获阶段
    从外向内捕获,到红色时,红色有事件,需在冒泡阶段执行,但此时是捕获阶段,先不执行,接下来是黄色,黄色在捕获阶段执行,所以先执行。
  • 到达当前目标阶段
    执行目标对象的事件函数,控制台输出蓝色。
  • 到达冒泡阶段
    由目标向外冒泡,到黄色时,捕获阶段已经执行,最后到达红色,红色在冒泡阶段执行,控制台输出红色。

实际开发中我们很少使用事件捕获,我们更关注事件冒泡。
其中onclickattachEvent只能得到冒泡阶段。
还有些事件是没有冒泡的,比如onbluronfocusonmouseenteronmouseleave

事件委托

假如,当我们需要给ul中的多个li添加点击事件时,通常会为每个li标签加上点击事件,此时看起来每个li的点击事件触发时调用的都是一个函数,但其实不是这样,每个li绑定的都是一个全新的函数,只不过样子一模一样,这里我们可以判断一下:

let liList = document.querySelectorAll('li')
for (let i = 0; i < liList.length; i++) {
  liList[i].onclick = function () {
    console.log(this.innerHTML)
  }
}
console.log(liList[0].onclick == liList[1].onclick); //false

至此,我们可以得到结论,有多少个li,那么就会有多少个函数被创建在内存中占据空间,这样对内存的开销是巨大的。

前面我们介绍到了事件冒泡的原理,那么我们就可以通过这种机制把事件加在父元素的身上,也就是ul标签,这样ul里面的li做点击事件时,都会冒泡到ul上,所以都会触发,这就是事件委托,委托它们的父级代为执行事件。

Event对象

  • 官方解释:event对象代表事件的状态,比如键盘按键的状态、鼠标的位置、鼠标按钮的状态。
  • 简单理解:事件发生后,跟事件相关的一系列信息数据的集合都放到这个对象里面,这个对象就是事件对象event,它有很多属性和方法。

这个event是个形参,系统帮我们设定为事件对象,不需要传递实参过去。当我们注册事件时,event对象就会被系统自动创建,并依次传递给事件监听器(事件处理函数)。

event对象提供了一个属性叫target,可以返回事件的目标节点,我们称为事件源,也就是说,target就可以表示为当前的事件操作的dom,但不是真正操作dom

IE678兼容性解决:e=e||window.event
下面我们可以这样改写:

let ul = document.querySelector('ul')
ul.onclick = function (e) {
  e = e || window.event
  console.log(e.target.innerHTML)
}

这样如果li数量较多,就可以大大减少dom操作,优化的性能可想而知。

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章           查看所有文章
加:2021-12-16 17:34:47  更:2021-12-16 17:37:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:29:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码