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日

相关文章

  • 详解es6新增数组方法简便了哪些操作

    下面是详解ES6新增数组方法简便了哪些操作的完整攻略: ES6新增数组方法 ES6为数组提供了一系列的新方法,这些方法使得我们可以更加简便的操作数组。下面是ES6中新增的数组方法: Array.from():将类数组对象或可迭代对象转换成数组。 Array.of():创建一个包含任意数量参数的新数组。 Array.copyWithin():复制数组的一部分到…

    JavaScript 2023年6月1日
    00
  • JS课堂笔记(4.11-4.16)

    一、简单了解JS 1. JavaScript(简称JS)是作为开发Web页面的脚本语言。 2. JS是从1995年由网景公司的布兰德开发。 3. JavaScript的标准是ECMAScript。 4. JS代码是从上往下执行的。  二、变量 1. 变量名的值可以重复赋值(值可以修改),变量可以重复声明。 2. JS中“+”号很特殊,只要是和字符串相加都会变…

    JavaScript 2023年4月22日
    00
  • Vue3 Element Plus el-form表单组件示例详解

    下面是“Vue3 Element Plus el-form表单组件示例详解”的完整攻略: 1. 简介 Vue3 Element Plus是一套基于Vue 3和Element Plus组件库的前端解决方案。它提供了丰富的UI组件和工具,用于开发高质量的Web应用程序。 其中,el-form表单组件是Element Plus中的一个常用组件之一,用于收集和验证用…

    JavaScript 2023年6月10日
    00
  • js原生Ajax的封装和原理详解

    下面是关于”js原生Ajax的封装和原理详解”的完整攻略: 什么是Ajax Ajax是指异步JavaScript和XML(Asynchronous Javascript and XML)技术,主要用于异步加载数据,是一种无需重新加载整个网页的情况下,能够更新部分网页的技术。 使用Ajax技术,通过XMLHttpRequest对象向服务器发送请求,并进行异步通…

    JavaScript 2023年6月11日
    00
  • js常用函数 不错

    当提到JavaScript编程语言时,函数是其中最重要的一部分。函数可以帮助你简化代码,提高代码的复用性。在JavaScript编程中,有很多种类型的函数,但有些函数是非常常见的,可以被广泛使用。在本文中,我将会介绍几种js常用函数,让你在编写代码时能够更加轻松自如。 1. 时间函数 时间函数在JavaScript开发中有着重要的作用,可以用来创建、解析和操…

    JavaScript 2023年5月27日
    00
  • JS实现快速比较两个字符串中包含有相同数字的方法

    要实现快速比较两个字符串中包含有相同数字的方法,可以使用 JavaScript 中的正则表达式进行匹配。具体实现可以分为以下步骤: 1. 获取字符串中的数字 使用正则表达式将字符串中的数字提取出来。 const str = "abc1def2ghi3jkl"; const pattern = /\d+/g; const numArray …

    JavaScript 2023年5月28日
    00
  • Vue联动Echarts实现数据大屏展示

    下面是“Vue联动Echarts实现数据大屏展示”的完整攻略。 一、什么是Vue联动Echarts Vue是一款流行的前端框架,Echarts是一款流行的数据可视化库。Vue联动Echarts的实现,就是将Vue与Echarts进行结合,实现数据的动态展示和交互。 二、如何实现Vue联动Echarts 1. 引入Echarts 在项目中引入Echarts库,…

    JavaScript 2023年6月11日
    00
  • js代码解密代码

    下面是“JS代码解密代码”的完整攻略。 什么是JS代码加密和解密? JS代码加密是为了防止源代码被盗用和反编译,在代码中嵌入了各种加密逻辑和算法来掩盖真实的代码逻辑,以实现反编译困难的目的。 JS代码解密就是将加密的JS代码还原成原来的代码,使得我们可以正常阅读和理解其逻辑,并进行二次开发或调试。 JS代码解密步骤: 分析加密方式 首先,我们需要了解代码被加…

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