【Web 前端】什么是事件冒泡?什么是事件委托?

简介: 【4月更文挑战第22天】【Web 前端】什么是事件冒泡?什么是事件委托?

image.png

理解事件冒泡和事件委托是 JavaScript 中事件处理机制的重要部分。它们是利用事件冒泡机制和委托原则来优化事件处理,提高性能和代码可维护性的方法。在本文中,我将详细解释事件冒泡和事件委托的概念、工作原理以及如何使用它们,并提供示例代码片段帮助读者更好地理解。

1. 事件冒泡(Event Bubbling)

事件冒泡是指当一个元素上的事件被触发后,事件会从触发的元素开始逐级向上传播,直到到达根元素。这意味着如果在一个元素上触发了某个事件,那么它的父元素也会依次触发相同的事件,直到到达文档根节点为止。事件冒泡是 DOM 事件处理模型的一部分,它允许在事件的传播过程中对事件进行捕获和处理。

工作原理:

  1. 当某个元素上的事件被触发时,该事件会首先在该元素上进行处理。
  2. 然后,事件会向上冒泡,依次触发父元素的相同事件处理程序。
  3. 该过程会一直持续,直到到达文档根节点。

示例代码:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Event Bubbling Example</title>
<style>
    div {
    
    
        padding: 10px;
        margin: 10px;
        border: 1px solid black;
    }
</style>
</head>
<body>

<div id="outer">
    <div id="inner">Click me</div>
</div>

<script>
    document.getElementById('outer').addEventListener('click', function() {
    
    
        console.log('Outer div clicked');
    });

    document.getElementById('inner').addEventListener('click', function() {
    
    
        console.log('Inner div clicked');
    });
</script>

</body>
</html>

在上面的示例中,当点击内部 div 元素时,控制台会输出两条日志:首先是 Inner div clicked,然后是 Outer div clicked。这就是事件冒泡的工作原理。

2. 事件委托(Event Delegation)

事件委托是利用事件冒泡机制,将事件处理程序绑定在其父元素上,以代理处理子元素的事件。通过事件委托,可以减少事件处理程序的数量,提高性能,并且能够动态处理新增的子元素,使得代码更加灵活和易于维护。

工作原理:

  1. 将事件处理程序绑定在父元素上。
  2. 当事件发生时,事件会冒泡到父元素。
  3. 在父元素上捕获到事件后,根据触发事件的具体子元素来执行相应的处理逻辑。

示例代码:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Event Delegation Example</title>
<style>
    ul {
    
    
        list-style-type: none;
        padding: 0;
    }
    li {
    
    
        padding: 10px;
        margin: 5px;
        background-color: #f0f0f0;
        cursor: pointer;
    }
    .selected {
    
    
        background-color: lightblue;
    }
</style>
</head>
<body>

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

<script>
    // 使用事件委托处理点击事件
    document.getElementById('list').addEventListener('click', function(event) {
    
    
        if (event.target.tagName === 'LI') {
    
    
            // 在父元素上捕获到

点击事件后,根据具体点击的子元素进行处理
            event.target.classList.toggle('selected');
        }
    });
</script>

</body>
</html>

在上面的示例中,我们将点击事件处理程序绑定在父元素 ul 上,然后通过判断点击事件的目标元素是否为 li 元素来决定是否进行处理。这样,无论是已经存在的 li 元素还是动态添加的 li 元素,都会被正确地处理。

3. 事件委托的优势

使用事件委托的优势包括:

  • 减少事件处理程序的数量: 通过将事件处理程序绑定在父元素上,可以避免为每个子元素都添加事件处理程序,从而减少了事件处理程序的数量,提高了性能。
  • 动态处理新增元素: 由于事件委托是基于事件冒泡机制的,因此它可以动态处理新增的子元素,而无需重新绑定事件处理程序。
  • 提高代码灵活性和可维护性: 通过委托事件处理,可以将处理逻辑集中在父元素上,使代码更加简洁、灵活和易于维护。

总结

事件冒泡和事件委托是 JavaScript 中事件处理机制的重要概念。事件冒泡利用事件从子元素向父元素的传播机制,可以在父元素上捕获和处理事件,而事件委托则是利用事件冒泡机制和委托原则来优化事件处理,提高性能和代码可维护性。通过本文的详细解释和示例代码,读者应该能够更好地理解事件冒泡和事件委托的概念、工作原理和优势,并在实际开发中灵活运用它们。

相关文章
|
8天前
|
前端开发
【前端web入门第五天】03 清除默认样式与外边距问题【附综合案例产品卡片与新闻列表】
本文档详细介绍了CSS中清除默认样式的方法,包括清除内外边距、列表项目符号等;探讨了外边距的合并与塌陷问题及其解决策略;讲解了行内元素垂直边距的处理技巧;并介绍了圆角与盒子阴影效果的实现方法。最后通过产品卡片和新闻列表两个综合案例,展示了所学知识的实际应用。
22 11
|
1天前
|
编解码 前端开发 JavaScript
web端 本地调用摄像头、前端摄像头
web端 本地调用摄像头、前端摄像头
|
8天前
|
前端开发
|
8天前
|
弹性计算 前端开发 容器
【前端web入门第六天】02 flex布局
Flex布局是一种现代CSS布局模式,通过给父元素设置`display: flex`,其子元素可自动挤压或拉伸。它包含弹性容器和弹性盒子,主轴默认为水平方向,侧轴为垂直方向。主轴对齐方式由`justify-content`属性控制,侧轴对齐方式包括`align-items`(针对所有子元素)和`align-self`(针对单个子元素)。修改主轴方向使用`flex-direction`属性,`flex`属性用于控制子元素在主轴上的伸缩比例。此外,`flex-wrap`属性允许子元素换行,而`align-content`属性则定义多行对齐方式。
|
8天前
|
前端开发
【前端web入门第五天】01 结构伪类选择器与伪元素选择器
本文介绍了CSS中的结构伪类选择器和伪元素选择器。结构伪类选择器如`nth-child`可根据元素结构关系进行选择,例如将列表中首个`&lt;li&gt;`元素背景设为绿色。伪元素选择器用于创建装饰性内容。
|
8天前
|
前端开发
【前端web入门第五天】02 盒子模型基础
本文档详细介绍了CSS中的盒子模型及其组成部分,包括内容区域、内边距、边框线和外边距。通过具体示例展示了如何设置边框线、内边距及外边距,并解释了尺寸计算方法和版心居中的技巧。内容丰富,示例清晰,有助于理解盒子模型在网页布局中的应用。
|
8天前
|
前端开发
【前端web入门第六天】01 CSS浮动
这是关于CSS布局第六天学习目标的介绍,主要解决多个`&lt;div&gt;`标签在同一行显示的问题,即一个在左边,另一个在右边。文中介绍了标准流、浮动及flex布局的概念,重点推荐使用flex布局。文章详细讲解了浮动的基本使用、布局技巧及清除浮动的方法,包括额外标签法、单伪元素法、双伪元素法和`overflow`隐藏法,并提供了示例代码帮助理解。
|
7天前
|
SpringCloudAlibaba JavaScript 前端开发
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架
分布式组件、nacos注册配置中心、openfegin远程调用、网关gateway、ES6脚本语言规范、vue、elementUI
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架
|
1月前
|
存储 前端开发 JavaScript
前端语言串讲 | 青训营笔记
前端语言串讲 | 青训营笔记
22 0
|
3月前
|
JSON 前端开发 JavaScript
前端Ajax、Axios和Fetch的用法和区别笔记
前端Ajax、Axios和Fetch的用法和区别笔记
67 2