DOM 事件流详解

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日

相关文章

  • asp.net新闻列表生成静态页之批量和单页生成

    下面我将详细讲解“ASP.NET新闻列表生成静态页之批量和单页生成”的完整攻略,包括过程、相关技术和示例说明: 背景介绍 在开发一个ASP.NET新闻网站时,为了让网站更加稳定和高效,需要将新闻列表页面和新闻详情页面都生成为静态页面。这样不仅可以大大提高访问速度,还能降低服务器负担。而对于新闻列表的生成,我们可以采用批量生成和单页生成两种方式,这篇文章将为你…

    JavaScript 2023年6月11日
    00
  • 详解js的视频和音频采集

    下面是详解JS的视频和音频采集的完整攻略: 1. 准备工作 在进行视频和音频采集前,需要先准备一些工作: 获取摄像头和麦克风的权限。可以使用 getUserMedia 方法来获取权限。该方法支持的浏览器版本:Can I use getUserMedia。 创建视频和音频对象。可以使用 HTMLMediaElement 和 MediaRecorder 来创建视…

    JavaScript 2023年5月28日
    00
  • javascript的hashCode函数实现代码小结

    为了讲解JavaScript的hashCode函数实现代码小结,让我先来介绍一下什么是hashCode。 HashCode是一种数据结构,它用于将一些复杂的数据结构简化为一些简单的数据类型,通常是数字或字符串。HashCode算法将数据结构转换为一个整数,使其更容易存储或比较。在JavaScript中,我们通常使用字符串作为HashCode的生成器。生成的H…

    JavaScript 2023年5月28日
    00
  • 详解JSON Web Token 入门教程

    题目中提到的“详解JSON Web Token 入门教程”的完整攻略,应该包括以下内容: 1. 什么是JSON Web Token 首先,我们需要明确JSON Web Token(JWT)是什么。JWT是一种用于身份验证的开放标准,它允许在网络上传输数据,以确保数据在传输过程中不会被篡改。JWT通常用来描述两个系统之间的请求和响应之间的详细信息。 2. JW…

    JavaScript 2023年5月27日
    00
  • JS 中Proxy代理和 Reflect反射方法示例详解

    JS 中Proxy代理和 Reflect反射方法示例详解 什么是 Proxy 代理 在 ES6 中,我们可以使用 Proxy 对象来创建代理对象。代理对象可以拦截并改变底层 JavaScript 引擎对原始对象的默认行为,从而实现自定义行为。 创建一个代理对象的基本语法如下: let proxy = new Proxy(target, handler) 其中…

    JavaScript 2023年6月10日
    00
  • JavaScript中常见陷阱小结

    请跟我一起详细了解JavaScript中的常见陷阱。 1. JavaScript中的类型转换陷阱 在JavaScript中,类型转换可能会导致一些令人困惑的结果。以下是一些常见的类型转换陷阱: 1.1 字符串和数字的陷阱 在JavaScript中,当字符串和数字进行相加时,会将字符串转换为数字并执行加法运算。但是,如果字符串中包含非数字字符,则会将其转换为N…

    JavaScript 2023年6月10日
    00
  • JavaScript深入理解作用域链与闭包详情

    JavaScript深入理解作用域链与闭包攻略 作用域链 在JavaScript中,作用域链是一种机制,它决定了变量和函数的访问权限。每个函数都有一个作用域链,它是由函数创建时所处的环境和所有父级环境的变量对象所组成。当函数执行时,它的作用域链会被用来解析变量和函数的引用。 示例一:作用域链的基本概念 var globalVar = ‘global’; fu…

    JavaScript 2023年6月10日
    00
  • IE浏览器不支持getElementsByClassName的解决方法

    IE浏览器不支持 getElementsByClassName 方法,而该方法可以非常方便地获取文档中指定 class 名称的元素集合。在解决这个问题之前,先简要了解下 getElementsByClassName 方法的用法。 getElementsByClassName 方法 document.getElementsByClassName(classna…

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