DOM 事件流详解

yizhihongxing

DOM 事件流详解

DOM 事件流是指从页面中接收事件、处理事件并响应事件的过程。它包含三个阶段:事件捕获、目标阶段和事件冒泡。

事件冒泡

事件冒泡指事件从 DOM 树中最深层的节点开始向父节点传递的过程,一直传递到最外层的节点(一般为window)。在事件冒泡的过程中,当事件触发时,先运行被点击元素的事件处理程序,然后向上层节点传递直到window。

以下是一个事件冒泡的示例:

<div id="outer" style="height:200px;border:1px solid;display: flex;justify-content: center;align-items: center;">
  <div id="inner" style="height:100px;width: 100px;background-color: rgba(0,255,0,0.5);"></div>
</div>

<script>
document.getElementById('inner').addEventListener(
  'click',
  function (event) {
    console.log('inner被点击了');
  }
);
document.getElementById('outer').addEventListener(
  'click',
  function (event) {
    console.log('outer被点击了');
  }
);
</script>

点击 #inner 区域,console.log 实现如下:

inner被点击了
outer被点击了

由此可见,事件从内部开始冒泡,先执行内部的 click 事件处理程序 function(){console.log('inner被点击了')},后执行外部的 click 事件处理程序 function(){console.log('outer被点击了')},即使内部事件执行了 event.stopPropagation() 方法,也不会阻止该事件执行完继续向上传播。

事件捕获

事件捕获是指事件从window节点开始传播,直到最深层的节点的过程。当目标节点触发事件,先将事件传播到window节点,层层向下传递至目标节点。在普通的dom事件中,事件捕获阶段不会触发任何事件的监听函数。

以下是一个事件捕获的示例:

<div id="outer" style="height:200px;border:1px solid;display: flex;justify-content: center;align-items: center;">
  <div id="inner" style="height:100px;width: 100px;background-color: rgba(0,255,0,0.5);"></div>
</div>

<script>
document.getElementById('inner').addEventListener(
  'click',
  function (event) {
    console.log('inner被点击了');
  },
  true // 设置为true表示在事件捕获阶段触发
);
document.getElementById('outer').addEventListener(
  'click',
  function (event) {
    console.log('outer被点击了');
  },
  true // 设置为true表示在事件捕获阶段触发
);
</script>

点击 #inner 区域,console.log 实现如下:

outer被点击了
inner被点击了

由此可见,在监听器中将事件进行了捕获,先执行外部的 click 事件处理程序 function(){console.log('outer被点击了')},后执行内部的 click 事件处理程序 function(){console.log('inner被点击了')}

事件委托

事件委托是指将事件处理器附加到一个父级节点上,而不是每个子节点上,以获得更好的性能和可维护性。在事件冒泡期间,监听器会检查事件源,并确定该事件是否来自子元素,然后运行相应的事件处理器。

以下是一个事件委托的示例:

<ul id="list">
  <li>1</li>
  <li>2</li>
  <li>3</li>
</ul>

<script>
document.getElementById('list').addEventListener('click', function (event) {
  console.log(event.target.innerHTML + '被点击了');
});
</script>

点击 li 标签,console.log 实现如下:

1被点击了
2被点击了
3被点击了

由此可见,通过在父元素上监听事件,尽管使用了委托,每个子元素仍然可以响应事件,从而实现了性能和可维护性的提高。

以上为DOM 事件流详解的完整攻略,希望可以帮助您更好地理解DOM 事件流机制。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:DOM 事件流详解 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • JS简单循环遍历json数组的方法

    JS简单循环遍历json数组的方法,通常使用for循环来实现。下面我将详细讲解以下步骤: 1. 获取JSON数组 首先,我们需要获取JSON数组,可以通过以下方式获取: const jsonArr = [ { "name": "张三", "age": 18, "gender": …

    JavaScript 2023年5月27日
    00
  • javascript题目,重写函数让其无限相加

    当我们看到“重写函数让其无限相加”这个题目时,第一时间想到的就是递归。递归是指函数直接或间接地调用自身。使用递归可以很方便地实现一个无限相加的函数。 下面是一个实现步骤的完整攻略: 1. 定义函数 首先,我们需要定义一个函数,函数名为add,参数为无限个数字,返回值为一个函数。 function add() { let args = Array.protot…

    JavaScript 2023年6月11日
    00
  • JSONP跨域的原理解析及其实现介绍

    下面我将详细讲解“JSONP跨域的原理解析及其实现介绍”的完整攻略。 什么是JSONP跨域 首先,需要了解JSONP(JSON with Padding)是什么。在网络应用中,由于安全策略的限制,浏览器不能直接跨域获取数据。JSONP利用“script”标签不受跨域限制的特性,通过动态创建“script”标签,并在服务器返回的数据中添加一个回调函数,从而实现…

    JavaScript 2023年5月27日
    00
  • js判断一个字符串是以某个字符串开头的简单实例

    下面是”js判断一个字符串是以某个字符串开头的简单实例”的完整攻略: 一、使用字符串的startsWith()函数进行判断 startsWith()函数是ES6引入的函数,用来判断一个字符串是否以另一个字符串开头。下面是一个简单的实例: var str = ‘Hello World!’; console.log(str.startsWith(‘Hello’)…

    JavaScript 2023年5月28日
    00
  • js调试系列 断点与动态调试[基础篇]

    JS调试系列:断点与动态调试(基础篇)是一篇介绍JavaScript调试的基础知识和调试技巧的文章。 本文主要介绍了调试中的两个基础概念——断点和动态调试,以及如何在Chrome浏览器中使用这两种调试方式来定位和解决JavaScript代码问题。 以下为本文的详细攻略: 断点调试 断点介绍 断点是指我们在代码某一处打上标记,当程序执行到这一处时会自动停下来,…

    JavaScript 2023年6月11日
    00
  • 动态加载js和css(外部文件)

    动态加载JS和CSS文件是在页面加载过程中向页面动态地添加外部资源文件。它可以帮助我们减少页面加载时间,提高网站性能,使网站更加简洁干净,增强用户体验。下面是完整攻略: 动态加载JS文件 通过DOM创建script标签 使用JavaScript函数 createElement() 和 appendChild() 创建一个新的script标签,将其插入到文档中…

    JavaScript 2023年5月27日
    00
  • JS实现的贪吃蛇游戏完整实例

    JS实现的贪吃蛇游戏完整实例 项目简介 贪吃蛇游戏是一款经典的游戏,在很多平台上都有出现。这个项目是一个用JavaScript实现的贪吃蛇游戏,玩家通过控制蛇的移动方向和吃掉生成的食物,在不碰到墙或自身的情况下尽可能地维持蛇的生命并获得高分。 用到的技术 HTML CSS JavaScript 实现思路 控制蛇的移动。通过定时器循环,不断移动蛇的位置。当蛇碰…

    JavaScript 2023年5月28日
    00
  • JavaScript自定义日期格式化函数详细解析

    JavaScript自定义日期格式化函数详细解析 在JavaScript中,日期是一个非常常见的数据类型。在处理日期时,我们通常需要对日期的格式进行调整,以便更好地展示给用户。为此,我们可以使用JavaScript自带的日期格式化函数toLocaleString()等来格式化日期,但是这些函数的格式选项非常有限,不够灵活。因此,本文将介绍如何自定义JavaS…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部